1d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* 2d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * 4d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * Use of this source code is governed by a BSD-style license 5d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * that can be found in the LICENSE file in the root of the source 6d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * tree. An additional intellectual property rights grant can be found 7d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * in the file PATENTS. All contributing project authors may 8d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org */ 10d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 11248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting// TODO(hlundin): Reformat file to meet style guide. 12d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 13d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* header includes */ 14d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <stdio.h> 15d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <stdlib.h> 16d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <string.h> 17d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef WIN32 18d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <winsock2.h> 19d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 20d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef WEBRTC_LINUX 21d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include <netinet/in.h> 22d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 23d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 2412dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <assert.h> 25d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 26dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting#include <algorithm> 27dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting 28cb23c0d9840a0f48921426cd777c2359bf917300minyue#include "webrtc/base/checks.h" 29d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include "webrtc/typedefs.h" 30cb23c0d9840a0f48921426cd777c2359bf917300minyue 31d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org// needed for NetEqDecoder 32e04a93bcf5e1b608c798a6a3148224b8035f0119kwiberg@webrtc.org#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h" 3374640895fafbb90a6630a6a91b80da0a7cff229cHenrik Kjellander#include "webrtc/modules/audio_coding/neteq/include/neteq.h" 34d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 35d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/************************/ 36d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Define payload types */ 37d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/************************/ 38d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 39d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include "PayloadTypes.h" 40d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 41cb23c0d9840a0f48921426cd777c2359bf917300minyuenamespace { 42cb23c0d9840a0f48921426cd777c2359bf917300minyueconst size_t kRtpDataSize = 8000; 43cb23c0d9840a0f48921426cd777c2359bf917300minyue} 44cb23c0d9840a0f48921426cd777c2359bf917300minyue 45d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*********************/ 46d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Misc. definitions */ 47d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*********************/ 48d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 49d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define STOPSENDTIME 3000 50248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define RESTARTSENDTIME 0 // 162500 51d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define FIRSTLINELEN 40 52248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define CHECK_NOT_NULL(a) \ 53248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((a) == 0) { \ 54248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\n %s \n line: %d \nerror at %s\n", __FILE__, __LINE__, #a); \ 55248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (-1); \ 56248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 57d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 58d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define MULTIPLE_SAME_TIMESTAMP 59d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define REPEAT_PACKET_DISTANCE 17 60d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define REPEAT_PACKET_COUNT 1 // number of extra packets to send 61d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 62d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define INSERT_OLD_PACKETS 63248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define OLD_PACKET 5 // how many seconds too old should the packet be? 64d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 65d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define TIMESTAMP_WRAPAROUND 66d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 67d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define RANDOM_DATA 68d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define RANDOM_PAYLOAD_DATA 69d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define RANDOM_SEED 10 70d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 71d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define INSERT_DTMF_PACKETS 72d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org//#define NO_DTMF_OVERDUB 73d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define DTMF_PACKET_INTERVAL 2000 74d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define DTMF_DURATION 500 75d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 76d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#define STEREO_MODE_FRAME 0 77248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define STEREO_MODE_SAMPLE_1 1 // 1 octet per sample 78248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#define STEREO_MODE_SAMPLE_2 2 // 2 octets per sample 79d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 80d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*************************/ 81d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Function declarations */ 82d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*************************/ 83d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 84d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid NetEQTest_GetCodec_and_PT(char* name, 85d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org webrtc::NetEqDecoder* codec, 86d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* PT, 87dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t frameLen, 88d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* fs, 89d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* bitrate, 90d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* useRed); 91d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgint NetEQTest_init_coders(webrtc::NetEqDecoder coder, 92dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t enc_frameSize, 93d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int bitrate, 94d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int sampfreq, 95d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int vad, 96dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t numChannels); 97d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid defineCodecs(webrtc::NetEqDecoder* usedCodec, int* noOfCodecs); 98dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingint NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels); 99ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwibergsize_t NetEQTest_encode(webrtc::NetEqDecoder coder, 100dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int16_t* indata, 101dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t frameLen, 102dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting unsigned char* encoded, 103dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int sampleRate, 104dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int* vad, 105dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int useVAD, 106dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int bitrate, 107dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t numChannels); 108d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid makeRTPheader(unsigned char* rtp_data, 109d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int payloadType, 110d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int seqNo, 111d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t timestamp, 112d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t ssrc); 113d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgint makeRedundantHeader(unsigned char* rtp_data, 114d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* payloadType, 115d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int numPayloads, 116d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t* timestamp, 117d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint16_t* blockLen, 118d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int seqNo, 119d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t ssrc); 120dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingsize_t makeDTMFpayload(unsigned char* payload_data, 121dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int Event, 122dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int End, 123dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int Volume, 124dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int Duration); 125dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingvoid stereoDeInterleave(int16_t* audioSamples, size_t numSamples); 126dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingvoid stereoInterleave(unsigned char* data, size_t dataLen, size_t stride); 127d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 128d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*********************/ 129d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Codec definitions */ 130d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/*********************/ 131d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 132d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#include "webrtc_vad.h" 133d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 134248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#if ((defined CODEC_PCM16B) || (defined NETEQ_ARBITRARY_CODEC)) 1353c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h" 136d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 137d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 1383c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#include "webrtc/modules/audio_coding/codecs/g711/g711_interface.h" 139d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 140d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 141248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G729Interface.h" 142d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 143d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 144248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G729_1Interface.h" 145d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 146d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 147248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "AMRInterface.h" 148248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "AMRCreation.h" 149d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 150d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 151248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "AMRWBInterface.h" 152248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "AMRWBCreation.h" 153d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 154d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 1553c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h" 156d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 157248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#if (defined CODEC_ISAC || defined CODEC_ISAC_SWB) 1583c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#include "webrtc/modules/audio_coding/codecs/isac/main/include/isac.h" 159d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 160d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NETEQ_ISACFIX_CODEC 1613c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#include "webrtc/modules/audio_coding/codecs/isac/fix/include/isacfix.h" 162248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#ifdef CODEC_ISAC 163728d9037c016c01295177fa700fc7927f0bb80bbPeter Kasting#error Cannot have both ISAC and ISACfix defined. Please de-select one. 164248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 165d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 166d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 1673c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h" 168d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 169d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 170248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 171d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 172d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 173248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 174d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 175d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 176248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 177d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 178d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 179248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 180d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 181d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 182248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 183d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 184d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 185248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G722_1Interface.h" 186d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 187d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G726 188248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G726Creation.h" 189248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "G726Interface.h" 190d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 191d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 192248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "GSMFRInterface.h" 193248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "GSMFRCreation.h" 194d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 195d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 196248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 1973c652b67468d182bd36aee4c31557621be50cc92kjellander@webrtc.org#include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h" 198d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 199248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#if ((defined CODEC_SPEEX_8) || (defined CODEC_SPEEX_16)) 200248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#include "SpeexInterface.h" 201d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 202cb23c0d9840a0f48921426cd777c2359bf917300minyue#ifdef CODEC_OPUS 203cb23c0d9840a0f48921426cd777c2359bf917300minyue#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h" 204cb23c0d9840a0f48921426cd777c2359bf917300minyue#endif 205d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 206d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/***********************************/ 207d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Global codec instance variables */ 208d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/***********************************/ 209d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 210248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingWebRtcVadInst* VAD_inst[2]; 211d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 212d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 213248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722EncInst* g722EncState[2]; 214d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 215d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 216d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 217248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1_24_encinst_t* G722_1_24enc_inst[2]; 218d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 219d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 220248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1_32_encinst_t* G722_1_32enc_inst[2]; 221d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 222d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 223248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1_16_encinst_t* G722_1_16enc_inst[2]; 224d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 225d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 226248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1C_24_encinst_t* G722_1C_24enc_inst[2]; 227d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 228d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 229248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1C_32_encinst_t* G722_1C_32enc_inst[2]; 230d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 231d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 232248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG722_1C_48_encinst_t* G722_1C_48enc_inst[2]; 233d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 234d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G726 235248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG726_encinst_t* G726enc_inst[2]; 236d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 237d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 238248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG729_encinst_t* G729enc_inst[2]; 239d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 240d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 241248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingG729_1_inst_t* G729_1_inst[2]; 242d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 243d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 244248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingAMR_encinst_t* AMRenc_inst[2]; 245248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint16_t AMR_bitrate; 246d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 247d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 248248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingAMRWB_encinst_t* AMRWBenc_inst[2]; 249248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint16_t AMRWB_bitrate; 250d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 251d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 252248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingIlbcEncoderInstance* iLBCenc_inst[2]; 253d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 254d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 255248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingISACStruct* ISAC_inst[2]; 256d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 257d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NETEQ_ISACFIX_CODEC 258248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingISACFIX_MainStruct* ISAC_inst[2]; 259d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 260d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 261248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingISACStruct* ISACSWB_inst[2]; 262d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 263d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 264248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingGSMFR_encinst_t* GSMFRenc_inst[2]; 265d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 266d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 267248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 268248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingCNG_enc_inst* CNGenc_inst[2]; 269d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 270d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_8 271248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingSPEEX_encinst_t* SPEEX8enc_inst[2]; 272d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 273d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_16 274248b0b079091bde4ac660b117d27bb9d3d7ca980Peter KastingSPEEX_encinst_t* SPEEX16enc_inst[2]; 275248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 276cb23c0d9840a0f48921426cd777c2359bf917300minyue#ifdef CODEC_OPUS 277cb23c0d9840a0f48921426cd777c2359bf917300minyueOpusEncInst* opus_inst[2]; 278cb23c0d9840a0f48921426cd777c2359bf917300minyue#endif 279248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 280248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint main(int argc, char* argv[]) { 281dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t packet_size; 282dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int fs; 283248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting webrtc::NetEqDecoder usedCodec; 284248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int payloadType; 285248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int bitrate = 0; 286248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int useVAD, vad; 287248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int useRed = 0; 288dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t len, enc_len; 289248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t org_data[4000]; 290cb23c0d9840a0f48921426cd777c2359bf917300minyue unsigned char rtp_data[kRtpDataSize]; 291248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t seqNo = 0xFFF; 292248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t ssrc = 1235412312; 293248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t timestamp = 0xAC1245; 294248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint16_t length, plen; 295248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t offset; 296248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting double sendtime = 0; 297248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int red_PT[2] = {0}; 298248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t red_TS[2] = {0}; 299248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint16_t red_len[2] = {0}; 300dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t RTPheaderLen = 12; 301cb23c0d9840a0f48921426cd777c2359bf917300minyue uint8_t red_data[kRtpDataSize]; 302d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef INSERT_OLD_PACKETS 303248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint16_t old_length, old_plen; 304dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t old_enc_len; 305248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int first_old_packet = 1; 306cb23c0d9840a0f48921426cd777c2359bf917300minyue unsigned char old_rtp_data[kRtpDataSize]; 307dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t packet_age = 0; 308d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 309d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef INSERT_DTMF_PACKETS 310248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int NTone = 1; 311248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int DTMFfirst = 1; 312248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t DTMFtimestamp; 313248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bool dtmfSent = false; 314248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 315248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bool usingStereo = false; 316dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t stereoMode = 0; 317dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t numChannels = 1; 318248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 319248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* check number of parameters */ 320248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((argc != 6) && (argc != 7)) { 321248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* print help text and exit */ 322248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Application to encode speech into an RTP stream.\n"); 3232a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("The program reads a PCM file and encodes is using the specified " 3242a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "codec.\n"); 3252a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("The coded speech is packetized in RTP packest and written to the " 3262a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "output file.\n"); 3272a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("The format of the RTP stream file is simlilar to that of " 3282a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "rtpplay,\n"); 329248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("but with the receive time euqal to 0 for all packets.\n"); 330248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Usage:\n\n"); 331248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("%s PCMfile RTPfile frameLen codec useVAD bitrate\n", argv[0]); 332248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("where:\n"); 333248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 334248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("PCMfile : PCM speech input file\n\n"); 335248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 336248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("RTPfile : RTP stream output file\n\n"); 337248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 3382a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("frameLen : 80...960... Number of samples per packet (limit " 3392a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "depends on codec)\n\n"); 340248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 341248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("codecName\n"); 342d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B 343248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcm16b 16 bit PCM (8kHz)\n"); 344d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 345d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_WB 346248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcm16b_wb 16 bit PCM (16kHz)\n"); 347d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 348d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_32KHZ 349248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcm16b_swb32 16 bit PCM (32kHz)\n"); 350d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 351d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_48KHZ 352248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcm16b_swb48 16 bit PCM (48kHz)\n"); 353d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 354d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 355248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcma g711 A-law (8kHz)\n"); 356d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 357d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 358248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : pcmu g711 u-law (8kHz)\n"); 359d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 360d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 3612a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g729 G729 (8kHz and 8kbps) CELP (One-Three " 3622a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "frame(s)/packet)\n"); 363d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 364d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 3652a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g729.1 G729.1 (16kHz) variable rate (8--32 " 3662a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "kbps)\n"); 367d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 368d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 3692a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1_16 G722.1 coder (16kHz) (g722.1 with " 3702a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "16kbps)\n"); 371d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 372d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 3732a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1_24 G722.1 coder (16kHz) (the 24kbps " 3742a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 375d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 376d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 3772a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1_32 G722.1 coder (16kHz) (the 32kbps " 3782a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 379d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 380d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 3812a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1C_24 G722.1 C coder (32kHz) (the 24kbps " 3822a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 383d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 384d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 3852a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1C_32 G722.1 C coder (32kHz) (the 32kbps " 3862a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 387d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 388d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 3892a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722.1C_48 G722.1 C coder (32kHz) (the 48kbps " 3902a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 391d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 392d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 393d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G726 394248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : g726_16 G726 coder (8kHz) 16kbps\n"); 395248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : g726_24 G726 coder (8kHz) 24kbps\n"); 396248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : g726_32 G726 coder (8kHz) 32kbps\n"); 397248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : g726_40 G726 coder (8kHz) 40kbps\n"); 398d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 399d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 4002a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : AMRXk Adaptive Multi Rate CELP codec " 4012a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "(8kHz)\n"); 4022a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" X = 4.75, 5.15, 5.9, 6.7, 7.4, 7.95, " 4032a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "10.2 or 12.2\n"); 404d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 405d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 4062a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : AMRwbXk Adaptive Multi Rate Wideband CELP " 4072a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "codec (16kHz)\n"); 4082a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" X = 7, 9, 12, 14, 16, 18, 20, 23 or " 4092a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "24\n"); 410d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 411d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 412248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : ilbc iLBC codec (8kHz and 13.8kbps)\n"); 413d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 414d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 4152a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : isac iSAC (16kHz and 32.0 kbps). To set " 4162a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "rate specify a rate parameter as last parameter\n"); 417d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 418d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 4192a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : isacswb iSAC SWB (32kHz and 32.0-52.0 kbps). " 4202a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "To set rate specify a rate parameter as last parameter\n"); 421d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 422d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 423248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : gsmfr GSM FR codec (8kHz and 13kbps)\n"); 424d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 425d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 4262a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : g722 g722 coder (16kHz) (the 64kbps " 4272a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "version)\n"); 428d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 429d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_8 430248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : speex8 speex coder (8 kHz)\n"); 431d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 432d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_16 433248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : speex16 speex coder (16 kHz)\n"); 434d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 435d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_RED 436d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 4372a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : red_pcm Redundancy RTP packet with 2*G711A " 4382a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "frames\n"); 439d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 440d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 4412a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf(" : red_isac Redundancy RTP packet with 2*iSAC " 4422a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "frames\n"); 443d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 444cb23c0d9840a0f48921426cd777c2359bf917300minyue#endif // CODEC_RED 445cb23c0d9840a0f48921426cd777c2359bf917300minyue#ifdef CODEC_OPUS 446cb23c0d9840a0f48921426cd777c2359bf917300minyue printf(" : opus Opus codec with FEC (48kHz, 32kbps, FEC" 447cb23c0d9840a0f48921426cd777c2359bf917300minyue " on and tuned for 5%% packet losses)\n"); 448d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 449248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\n"); 450d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 451d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 452248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 453248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("useVAD : 0 Voice Activity Detection is switched off\n"); 454248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf(" : 1 Voice Activity Detection is switched on\n\n"); 455d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#else 4562a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("useVAD : 0 Voice Activity Detection switched off (on not " 4572a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "supported)\n\n"); 458248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 4592a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("bitrate : Codec bitrate in bps (only applies to vbr " 4602a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "codecs)\n\n"); 461248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 462248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (0); 463248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 464248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 465248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting FILE* in_file = fopen(argv[1], "rb"); 466248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting CHECK_NOT_NULL(in_file); 467248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Input file: %s\n", argv[1]); 468248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting FILE* out_file = fopen(argv[2], "wb"); 469248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting CHECK_NOT_NULL(out_file); 470248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Output file: %s\n\n", argv[2]); 471dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int packet_size_int = atoi(argv[3]); 472dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting if (packet_size_int <= 0) { 473dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting printf("Packet size %d must be positive", packet_size_int); 474f045e4da43e671ae511aa1d9b6ef2968256a745dPeter Kasting return -1; 475f045e4da43e671ae511aa1d9b6ef2968256a745dPeter Kasting } 476dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting printf("Packet size: %d\n", packet_size_int); 477dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting packet_size = static_cast<size_t>(packet_size_int); 478248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 479248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // check for stereo 480248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (argv[4][strlen(argv[4]) - 1] == '*') { 481248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // use stereo 482248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting usingStereo = true; 483248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting numChannels = 2; 484248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting argv[4][strlen(argv[4]) - 1] = '\0'; 485248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 486248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 487248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NetEQTest_GetCodec_and_PT(argv[4], &usedCodec, &payloadType, packet_size, &fs, 488248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting &bitrate, &useRed); 489248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 490248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useRed) { 491248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting RTPheaderLen = 12 + 4 + 1; /* standard RTP = 12; 4 bytes per redundant 492248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload, except last one which is 1 byte */ 493248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 494248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 495248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting useVAD = atoi(argv[5]); 496d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if !(defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 497248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 498248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useVAD != 0) { 499248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: this simulation does not support VAD/DTX/CNG\n"); 500248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 501248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 502248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 503248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // check stereo type 504248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usingStereo) { 505248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting switch (usedCodec) { 506248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // sample based codecs 507ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCMu: 508ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCMa: 509ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG722: { 510248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // 1 octet per sample 511248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoMode = STEREO_MODE_SAMPLE_1; 512248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 513248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 514ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16B: 515ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16Bwb: 516ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz: 517ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz: { 518248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // 2 octets per sample 519248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoMode = STEREO_MODE_SAMPLE_2; 520248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 521248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 522d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 523248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // fixed-rate frame codecs (with internal VAD) 524248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting default: { 525248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Cannot use codec %s as stereo codec\n", argv[4]); 526248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 527248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 528d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 529248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 530248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 531ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg if ((usedCodec == webrtc::NetEqDecoder::kDecoderISAC) || 532ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg (usedCodec == webrtc::NetEqDecoder::kDecoderISACswb)) { 533248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (argc != 7) { 534ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) { 535248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bitrate = 32000; 5362a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Running iSAC at default bitrate of 32000 bps (to specify " 5372a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "explicitly add the bps as last parameter)\n"); 538248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else // (usedCodec==webrtc::kDecoderISACswb) 539248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting { 540248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bitrate = 56000; 5412a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Running iSAC at default bitrate of 56000 bps (to specify " 5422a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "explicitly add the bps as last parameter)\n"); 543248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 544248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 545248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bitrate = atoi(argv[6]); 546ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) { 547248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 10000) || (bitrate > 32000)) { 5482a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: iSAC bitrate must be between 10000 and 32000 bps (%i " 5492a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "is invalid)\n", bitrate); 550248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 551d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 552248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Running iSAC at bitrate of %i bps\n", bitrate); 553248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else // (usedCodec==webrtc::kDecoderISACswb) 554248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting { 555248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 32000) || (bitrate > 56000)) { 5562a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: iSAC SWB bitrate must be between 32000 and 56000 bps " 5572a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "(%i is invalid)\n", bitrate); 558248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 559d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 560248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 561d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 562248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 563248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (argc == 7) { 5642a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Bitrate parameter can only be specified for iSAC, G.723, " 5652a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "and G.729.1\n"); 566248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 567d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 568248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 569248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 570248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useRed) { 571248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Redundancy engaged. "); 572248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 573ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg printf("Used codec: %i\n", static_cast<int>(usedCodec)); 574248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Payload type: %i\n", payloadType); 575248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 576248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NetEQTest_init_coders(usedCodec, packet_size, bitrate, fs, useVAD, 577248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting numChannels); 578248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 579248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* write file header */ 580248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // fprintf(out_file, "#!RTPencode%s\n", "1.0"); 581248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting fprintf(out_file, "#!rtpplay%s \n", 582248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting "1.0"); // this is the string that rtpplay needs 583248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t dummy_variable = 0; // should be converted to network endian format, 584248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // but does not matter when 0 585248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 4, 1, out_file) != 1) { 586248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 587248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 588248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 4, 1, out_file) != 1) { 589248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 590248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 591248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 4, 1, out_file) != 1) { 592248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 593248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 594248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 2, 1, out_file) != 1) { 595248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 596248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 597248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&dummy_variable, 2, 1, out_file) != 1) { 598248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 599248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 600d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 601d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef TIMESTAMP_WRAPAROUND 602248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting timestamp = 0xFFFFFFFF - fs * 10; /* should give wrap-around in 10 seconds */ 603d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 604d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if defined(RANDOM_DATA) | defined(RANDOM_PAYLOAD_DATA) 605248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting srand(RANDOM_SEED); 606d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 607d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 608248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* if redundancy is used, the first redundant payload is zero length */ 609248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_len[0] = 0; 610d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 611248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* read first frame */ 612248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels; 613d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 614248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* de-interleave if stereo */ 615248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usingStereo) { 616248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoDeInterleave(org_data, len * numChannels); 617248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 618d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 619248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting while (len == packet_size) { 620d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef INSERT_DTMF_PACKETS 621248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting dtmfSent = false; 622248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 623248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sendtime >= NTone * DTMF_PACKET_INTERVAL) { 624248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sendtime < NTone * DTMF_PACKET_INTERVAL + DTMF_DURATION) { 625248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // tone has not ended 626248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (DTMFfirst == 1) { 627248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting DTMFtimestamp = timestamp; // save this timestamp 628248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting DTMFfirst = 0; 629d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 630248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc); 631248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len = makeDTMFpayload( 632248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting &rtp_data[12], NTone % 12, 0, 4, 633248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (int)(sendtime - NTone * DTMF_PACKET_INTERVAL) * (fs / 1000) + len); 634248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 635248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // tone has ended 636248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc); 637248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 1, 4, 638248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting DTMF_DURATION * (fs / 1000)); 639248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NTone++; 640248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting DTMFfirst = 1; 641248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 642248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 643248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* write RTP packet to file */ 644b7e5054414ff524f9db81dab7917729b8c4c8bcbPeter Kasting length = htons(static_cast<unsigned short>(12 + enc_len + 8)); 645b7e5054414ff524f9db81dab7917729b8c4c8bcbPeter Kasting plen = htons(static_cast<unsigned short>(12 + enc_len)); 646248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = (uint32_t)sendtime; //(timestamp/(fs/1000)); 647248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = htonl(offset); 648248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&length, 2, 1, out_file) != 1) { 649248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 650248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 651248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&plen, 2, 1, out_file) != 1) { 652248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 653248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 654248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&offset, 4, 1, out_file) != 1) { 655248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 656248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 657248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) { 658248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 659248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 660248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 661248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting dtmfSent = true; 662248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 663d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 664d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 665d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NO_DTMF_OVERDUB 666248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* If DTMF is sent, we should not send any speech packets during the same 667248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting * time */ 668248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (dtmfSent) { 669248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len = 0; 670248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 671d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 672248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* encode frame */ 673248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len = 674248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NetEQTest_encode(usedCodec, org_data, packet_size, &rtp_data[12], fs, 675248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting &vad, useVAD, bitrate, numChannels); 676d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 677248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usingStereo && stereoMode != STEREO_MODE_FRAME && vad == 1) { 678248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // interleave the encoded payload for sample-based codecs (not for CNG) 679248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoInterleave(&rtp_data[12], enc_len, stereoMode); 680248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 681248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#ifdef NO_DTMF_OVERDUB 682248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 683248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 684d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 685248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_len > 0 && 686248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (sendtime <= STOPSENDTIME || sendtime > RESTARTSENDTIME)) { 687248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useRed) { 688248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (red_len[0] > 0) { 689248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memmove(&rtp_data[RTPheaderLen + red_len[0]], &rtp_data[12], enc_len); 690248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]); 691248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 692b7e5054414ff524f9db81dab7917729b8c4c8bcbPeter Kasting red_len[1] = static_cast<uint16_t>(enc_len); 693248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_TS[1] = timestamp; 694248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (vad) 695248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[1] = payloadType; 696248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else 697248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[1] = NETEQ_CODEC_CN_PT; 698248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 699248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++, 700248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ssrc); 701248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 702248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len += red_len[0] + RTPheaderLen - 12; 703248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { // do not use redundancy payload for this packet, i.e., only 704248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // last payload 705248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memmove(&rtp_data[RTPheaderLen - 4], &rtp_data[12], enc_len); 706248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]); 707248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 708b7e5054414ff524f9db81dab7917729b8c4c8bcbPeter Kasting red_len[1] = static_cast<uint16_t>(enc_len); 709248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_TS[1] = timestamp; 710248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (vad) 711248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[1] = payloadType; 712248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else 713248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[1] = NETEQ_CODEC_CN_PT; 714248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 715248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++, 716248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ssrc); 717248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 718248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting enc_len += red_len[0] + RTPheaderLen - 4 - 719248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 12; // 4 is length of redundancy header (not used) 720248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 721248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 722248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* make RTP header */ 723248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (vad) // regular speech data 724248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, payloadType, seqNo++, timestamp, ssrc); 725248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else // CNG data 726248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, NETEQ_CODEC_CN_PT, seqNo++, timestamp, ssrc); 727248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 728d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef MULTIPLE_SAME_TIMESTAMP 729248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int mult_pack = 0; 730248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting do { 731248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif // MULTIPLE_SAME_TIMESTAMP 732248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* write RTP packet to file */ 733b7e5054414ff524f9db81dab7917729b8c4c8bcbPeter Kasting length = htons(static_cast<unsigned short>(12 + enc_len + 8)); 734b7e5054414ff524f9db81dab7917729b8c4c8bcbPeter Kasting plen = htons(static_cast<unsigned short>(12 + enc_len)); 735248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = (uint32_t)sendtime; 736248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting //(timestamp/(fs/1000)); 737248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = htonl(offset); 738248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&length, 2, 1, out_file) != 1) { 739248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 740248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 741248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&plen, 2, 1, out_file) != 1) { 742248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 743248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 744248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&offset, 4, 1, out_file) != 1) { 745248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 746248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 747d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef RANDOM_DATA 748dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting for (size_t k = 0; k < 12 + enc_len; k++) { 749248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[k] = rand() + rand(); 750248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 751d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 752d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef RANDOM_PAYLOAD_DATA 753dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting for (size_t k = 12; k < 12 + enc_len; k++) { 754248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[k] = rand() + rand(); 755248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 756d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 757248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) { 758248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 759248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 760d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef MULTIPLE_SAME_TIMESTAMP 761248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } while ((seqNo % REPEAT_PACKET_DISTANCE == 0) && 762248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (mult_pack++ < REPEAT_PACKET_COUNT)); 763248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif // MULTIPLE_SAME_TIMESTAMP 764d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 765d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef INSERT_OLD_PACKETS 766248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (packet_age >= OLD_PACKET * fs) { 767248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!first_old_packet) { 768248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // send the old packet 769248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&old_length, 2, 1, out_file) != 1) { 770248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 771248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 772248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&old_plen, 2, 1, out_file) != 1) { 773248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 774248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 775248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(&offset, 4, 1, out_file) != 1) { 776248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 777248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 778248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (fwrite(old_rtp_data, 12 + old_enc_len, 1, out_file) != 1) { 779248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return -1; 780248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 781248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 782248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // store current packet as old 783248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting old_length = length; 784248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting old_plen = plen; 785248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(old_rtp_data, rtp_data, 12 + enc_len); 786248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting old_enc_len = enc_len; 787248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting first_old_packet = 0; 788248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting packet_age = 0; 789248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 790248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting packet_age += packet_size; 791248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 792248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 793248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useRed) { 794248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting/* move data to redundancy store */ 795d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 796ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) { 797248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting assert(!usingStereo); // Cannot handle stereo yet 798248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_len[0] = WebRtcIsac_GetRedPayload(ISAC_inst[0], red_data); 799248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 800d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 801248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(red_data, &rtp_data[RTPheaderLen + red_len[0]], enc_len); 802248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_len[0] = red_len[1]; 803248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#ifdef CODEC_ISAC 804d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 805248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#endif 806248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_TS[0] = red_TS[1]; 807248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting red_PT[0] = red_PT[1]; 808248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 809248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 810d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 811248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* read next frame */ 812248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels; 813248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* de-interleave if stereo */ 814248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (usingStereo) { 815248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting stereoDeInterleave(org_data, len * numChannels); 816248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 817d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 818248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (payloadType == NETEQ_CODEC_G722_PT) 819248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting timestamp += len >> 1; 820248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting else 821248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting timestamp += len; 822d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 823248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting sendtime += (double)len / (fs / 1000); 824248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 825d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 826248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting NetEQTest_free_coders(usedCodec, numChannels); 827248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting fclose(in_file); 828248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting fclose(out_file); 829248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Done!\n"); 830d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 831248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (0); 832248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting} 833d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 834d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/****************/ 835d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/* Subfunctions */ 836d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org/****************/ 837d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 838d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid NetEQTest_GetCodec_and_PT(char* name, 839d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org webrtc::NetEqDecoder* codec, 840d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* PT, 841dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t frameLen, 842d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* fs, 843d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* bitrate, 844d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* useRed) { 845248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *bitrate = 0; /* Default bitrate setting */ 846248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *useRed = 0; /* Default no redundancy */ 847248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 848248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!strcmp(name, "pcmu")) { 849ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderPCMu; 850248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCMU_PT; 851248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 852248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcma")) { 853ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderPCMa; 854248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCMA_PT; 855248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 856248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcm16b")) { 857ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderPCM16B; 858248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCM16B_PT; 859248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 860248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcm16b_wb")) { 861ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderPCM16Bwb; 862248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCM16B_WB_PT; 863248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 16000; 864248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcm16b_swb32")) { 865ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz; 866248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCM16B_SWB32KHZ_PT; 867248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 32000; 868248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "pcm16b_swb48")) { 869ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz; 870248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCM16B_SWB48KHZ_PT; 871248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 48000; 872248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "g722")) { 873ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderG722; 874248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_G722_PT; 875248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 16000; 876248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if ((!strcmp(name, "ilbc")) && 877248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ((frameLen % 240 == 0) || (frameLen % 160 == 0))) { 878248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 879ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderILBC; 880248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_ILBC_PT; 881248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "isac")) { 882248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 16000; 883ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderISAC; 884248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_ISAC_PT; 885248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "isacswb")) { 886248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 32000; 887ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderISACswb; 888248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_ISACSWB_PT; 889248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "red_pcm")) { 890ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderPCMa; 891248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */ 892248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 8000; 893248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *useRed = 1; 894248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (!strcmp(name, "red_isac")) { 895ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg *codec = webrtc::NetEqDecoder::kDecoderISAC; 896248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *PT = NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */ 897248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *fs = 16000; 898248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *useRed = 1; 899cb23c0d9840a0f48921426cd777c2359bf917300minyue } else if (!strcmp(name, "opus")) { 900cb23c0d9840a0f48921426cd777c2359bf917300minyue *codec = webrtc::NetEqDecoder::kDecoderOpus; 901cb23c0d9840a0f48921426cd777c2359bf917300minyue *PT = NETEQ_CODEC_OPUS_PT; /* this will be the PT for the sub-headers */ 902cb23c0d9840a0f48921426cd777c2359bf917300minyue *fs = 48000; 903248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 904248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Not a supported codec (%s)\n", name); 905248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 906248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 907d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 908d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 909248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kastingint NetEQTest_init_coders(webrtc::NetEqDecoder coder, 910dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t enc_frameSize, 911248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int bitrate, 912248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int sampfreq, 913248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int vad, 914dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t numChannels) { 915248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int ok = 0; 916248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 917dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting for (size_t k = 0; k < numChannels; k++) { 918248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting VAD_inst[k] = WebRtcVad_Create(); 919248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!VAD_inst[k]) { 920248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for VAD instance\n"); 921248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 922248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 923248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcVad_Init(VAD_inst[k]); 924248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok == -1) { 925248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Initialization of VAD struct failed\n"); 926248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 927248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 928d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 929d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 930248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 931248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcCng_CreateEnc(&CNGenc_inst[k]); 932248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 933248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for CNG encoding instance\n"); 934248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 935248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 936248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq <= 16000) { 937248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcCng_InitEnc(CNGenc_inst[k], sampfreq, 200, 5); 938248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok == -1) { 939248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Initialization of CNG struct failed. Error code %d\n", 940248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcCng_GetErrorCodeEnc(CNGenc_inst[k])); 941248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 942248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 943248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 944d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 945d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 946248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting switch (coder) { 947d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B 948ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16B: 949d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 950d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_WB 951ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16Bwb: 952d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 953d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_32KHZ 954ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz: 955d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 956d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_48KHZ 957ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz: 958d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 959d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 960ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCMu: 961ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCMa: 962d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 963d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org // do nothing 964d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 965d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 966248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG729: 967248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 968248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 80) || (enc_frameSize == 160) || 969248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 240) || (enc_frameSize == 320) || 970248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 400) || (enc_frameSize == 480)) { 971248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG729_CreateEnc(&G729enc_inst[k]); 972248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 9732a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for G729 encoding " 9742a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 975248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 976d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 977248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 9782a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError: g729 only supports 10, 20, 30, 40, 50 or 60 " 9792a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "ms!!\n\n"); 980d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 981248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 982248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG729_EncoderInit(G729enc_inst[k], vad); 983248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((vad == 1) && (enc_frameSize != 80)) { 9842a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - This simulation only supports VAD for G729 at " 985dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting "10ms packets (not %" PRIuS "ms)\n", (enc_frameSize >> 3)); 986248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 987248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 988248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - g729 is only developed for 8kHz \n"); 989248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 990d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 991d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 992d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 993d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 994248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG729_1: 995248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 996248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 320) || (enc_frameSize == 640) || 997248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 960)) { 998248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7291_Create(&G729_1_inst[k]); 999248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 10002a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for G.729.1 codec " 10012a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1002248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1003248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1004248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1005248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G.729.1 only supports 20, 40 or 60 ms!!\n\n"); 1006248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1007248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1008248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!(((bitrate >= 12000) && (bitrate <= 32000) && 1009248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (bitrate % 2000 == 0)) || 1010248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (bitrate == 8000))) { 1011248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* must be 8, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, or 32 kbps */ 10122a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError: G.729.1 bitrate must be 8000 or 12000--32000 in " 10132a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "steps of 2000 bps\n"); 1014d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1015248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1016248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7291_EncoderInit(G729_1_inst[k], bitrate, 0 /* flag8kHz*/, 1017248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 0 /*flagG729mode*/); 1018248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1019248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G.729.1 input is always 16 kHz \n"); 1020248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1021d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1022d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1023d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1024d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_8 1025248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderSPEEX_8: 1026248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 1027248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 320) || 1028248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 480)) { 1029248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcSpeex_CreateEnc(&SPEEX8enc_inst[k], sampfreq); 1030248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 10312a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for Speex encoding " 10322a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1033248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1034d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1035248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1036248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n"); 1037248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1038248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1039248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((vad == 1) && (enc_frameSize != 160)) { 10402a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - This simulation only supports VAD for Speex at " 1041dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting "20ms packets (not %" PRIuS "ms)\n", 1042248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize >> 3)); 1043248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting vad = 0; 1044248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1045248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcSpeex_EncoderInit(SPEEX8enc_inst[k], 0 /*vbr*/, 1046248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 3 /*complexity*/, vad); 1047248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) 1048248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1049d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } else { 10502a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - Speex8 called with sample frequency other than 8 " 10512a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "kHz.\n\n"); 1052d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1053d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1054d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1055d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_16 1056248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderSPEEX_16: 1057248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1058248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 320) || (enc_frameSize == 640) || 1059248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 960)) { 1060248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcSpeex_CreateEnc(&SPEEX16enc_inst[k], sampfreq); 1061248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 10622a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for Speex encoding " 10632a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1064248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1065d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1066248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1067248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: Speex only supports 20, 40, and 60 ms!!\n\n"); 1068248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1069248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1070248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((vad == 1) && (enc_frameSize != 320)) { 10712a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - This simulation only supports VAD for Speex at " 1072dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting "20ms packets (not %" PRIuS "ms)\n", 1073248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize >> 4)); 1074248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting vad = 0; 1075248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1076248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcSpeex_EncoderInit(SPEEX16enc_inst[k], 0 /*vbr*/, 1077248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 3 /*complexity*/, vad); 1078248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) 1079248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1080d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } else { 10812a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - Speex16 called with sample frequency other than 16 " 10822a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "kHz.\n\n"); 1083d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1084d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1085d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1086d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1087d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 1088248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1_16: 1089248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1090248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221_CreateEnc16(&G722_1_16enc_inst[k]); 1091248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1092248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1 instance\n"); 1093248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1094248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1095248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 320) { 1096248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1097248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 only supports 20 ms!!\n\n"); 1098d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1099248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1100248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_EncoderInit16((G722_1_16_encinst_t*)G722_1_16enc_inst[k]); 1101248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1102248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 is only developed for 16kHz \n"); 1103248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1104d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1105d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1106d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1107d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 1108248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1_24: 1109248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1110248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221_CreateEnc24(&G722_1_24enc_inst[k]); 1111248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1112248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1 instance\n"); 1113248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1114248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1115248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 320) { 1116248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1117248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 only supports 20 ms!!\n\n"); 1118d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1119248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1120248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_EncoderInit24((G722_1_24_encinst_t*)G722_1_24enc_inst[k]); 1121248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1122248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 is only developed for 16kHz \n"); 1123248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1124d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1125d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1126d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1127d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 1128248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1_32: 1129248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1130248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221_CreateEnc32(&G722_1_32enc_inst[k]); 1131248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1132248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1 instance\n"); 1133248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1134248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1135248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 320) { 1136248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1137248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 only supports 20 ms!!\n\n"); 1138d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1139248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1140248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_EncoderInit32((G722_1_32_encinst_t*)G722_1_32enc_inst[k]); 1141248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1142248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 is only developed for 16kHz \n"); 1143248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1144d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1145d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1146d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1147d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 1148248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1C_24: 1149248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 32000) { 1150248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221C_CreateEnc24(&G722_1C_24enc_inst[k]); 1151248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1152248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1C instance\n"); 1153248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1154248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1155248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 640) { 1156248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1157248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 C only supports 20 ms!!\n\n"); 1158d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1159248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1160248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_EncoderInit24( 1161248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (G722_1C_24_encinst_t*)G722_1C_24enc_inst[k]); 1162248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1163248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 C is only developed for 32kHz \n"); 1164248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1165d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1166d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1167d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1168d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 1169248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1C_32: 1170248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 32000) { 1171248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221C_CreateEnc32(&G722_1C_32enc_inst[k]); 1172248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1173248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1C instance\n"); 1174248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1175248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1176248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 640) { 1177248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1178248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 C only supports 20 ms!!\n\n"); 1179d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1180248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1181248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_EncoderInit32( 1182248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (G722_1C_32_encinst_t*)G722_1C_32enc_inst[k]); 1183248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1184248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 C is only developed for 32kHz \n"); 1185248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1186d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1187d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1188d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1189d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 1190248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderG722_1C_48: 1191248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 32000) { 1192248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcG7221C_CreateEnc48(&G722_1C_48enc_inst[k]); 1193248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1194248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for G.722.1C instance\n"); 1195248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1196248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1197248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 640) { 1198248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1199248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError: G722.1 C only supports 20 ms!!\n\n"); 1200d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1201248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1202248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_EncoderInit48( 1203248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (G722_1C_48_encinst_t*)G722_1C_48enc_inst[k]); 1204248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1205248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - G722.1 C is only developed for 32kHz \n"); 1206248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1207d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1208d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1209d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1210d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 1211ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG722: 1212248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1213248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize % 2 == 0) { 1214248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1215248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf( 1216248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting "\nError - g722 frames must have an even number of " 1217248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting "enc_frameSize\n"); 1218d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1219248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1220248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG722_CreateEncoder(&g722EncState[k]); 1221248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG722_EncoderInit(g722EncState[k]); 1222248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1223248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - g722 is only developed for 16kHz \n"); 1224248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1225d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1226d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1227d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1228d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 1229248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderAMR: 1230248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 1231248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcAmr_CreateEnc(&AMRenc_inst[k]); 1232248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1233248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf( 1234248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting "Error: Couldn't allocate memory for AMR encoding instance\n"); 1235248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1236248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1237248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 320) || 1238248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 480)) { 1239248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1240248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - AMR must have a multiple of 160 enc_frameSize\n"); 1241d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1242248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1243248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmr_EncoderInit(AMRenc_inst[k], vad); 1244248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmr_EncodeBitmode(AMRenc_inst[k], AMRBandwidthEfficient); 1245248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMR_bitrate = bitrate; 1246248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1247248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - AMR is only developed for 8kHz \n"); 1248248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1249d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1250d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1251d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1252d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 1253248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderAMRWB: 1254248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1255248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcAmrWb_CreateEnc(&AMRWBenc_inst[k]); 1256248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 12572a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for AMRWB encoding " 12582a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1259248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1260248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1261dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting if (((enc_frameSize / 320) > 3) || ((enc_frameSize % 320) != 0)) { 1262248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - AMRwb must have frameSize of 20, 40 or 60ms\n"); 1263248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1264248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1265248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmrWb_EncoderInit(AMRWBenc_inst[k], vad); 1266248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (bitrate == 7000) { 1267248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_7k; 1268248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 9000) { 1269248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_9k; 1270248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 12000) { 1271248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_12k; 1272248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 14000) { 1273248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_14k; 1274248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 16000) { 1275248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_16k; 1276248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 18000) { 1277248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_18k; 1278248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 20000) { 1279248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_20k; 1280248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 23000) { 1281248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_23k; 1282248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else if (bitrate == 24000) { 1283248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting AMRWB_bitrate = AMRWB_MODE_24k; 1284248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1285248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmrWb_EncodeBitmode(AMRWBenc_inst[k], AMRBandwidthEfficient); 1286d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1287d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } else { 1288248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - AMRwb is only developed for 16kHz \n"); 1289248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1290d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1291d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1292d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1293d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 1294ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderILBC: 1295248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 1296248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIlbcfix_EncoderCreate(&iLBCenc_inst[k]); 1297248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 12982a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for iLBC encoding " 12992a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1300d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1301248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1302248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 240) || 1303248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 320) || (enc_frameSize == 480)) { 1304248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 13052a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iLBC only supports 160, 240, 320 and 480 " 13062a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "enc_frameSize (20, 30, 40 and 60 ms)\n"); 1307248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1308248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1309248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 320)) { 1310248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* 20 ms version */ 1311248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 20); 1312248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1313248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* 30 ms version */ 1314248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 30); 1315248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1316248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1317248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - iLBC is only developed for 8kHz \n"); 1318248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1319d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1320d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1321d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1322d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 1323ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderISAC: 1324248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1325248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIsac_Create(&ISAC_inst[k]); 1326248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1327248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for iSAC instance\n"); 1328248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1329248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1330248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 480) || (enc_frameSize == 960)) { 1331248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1332248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n"); 1333248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1334248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1335248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_EncoderInit(ISAC_inst[k], 1); 1336248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 10000) || (bitrate > 32000)) { 13372a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC bitrate has to be between 10000 and 32000 " 13382a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "bps (not %i)\n", 1339248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting bitrate); 1340d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1341248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1342dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting WebRtcIsac_Control(ISAC_inst[k], bitrate, 1343dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting static_cast<int>(enc_frameSize >> 4)); 1344248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 13452a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or " 13462a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "60 ms)\n"); 1347248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1348d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1349d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1350d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1351d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NETEQ_ISACFIX_CODEC 1352248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderISAC: 1353248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 16000) { 1354248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIsacfix_Create(&ISAC_inst[k]); 1355248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1356248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for iSAC instance\n"); 1357248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1358248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1359248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 480) || (enc_frameSize == 960)) { 1360248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1361248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n"); 1362d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1363248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1364248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsacfix_EncoderInit(ISAC_inst[k], 1); 1365248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 10000) || (bitrate > 32000)) { 13662a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC bitrate has to be between 10000 and 32000 " 13672a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "bps (not %i)\n", bitrate); 1368248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1369248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1370248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsacfix_Control(ISAC_inst[k], bitrate, enc_frameSize >> 4); 1371248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 13722a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or " 13732a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "60 ms)\n"); 1374248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1375d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1376d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1377d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1378d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 1379ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderISACswb: 1380248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 32000) { 1381248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIsac_Create(&ISACSWB_inst[k]); 1382248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1383248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't allocate memory for iSAC SWB instance\n"); 1384248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1385248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1386248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (enc_frameSize == 960) { 1387248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1388248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - iSAC SWB only supports frameSize 30 ms\n"); 1389d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1390248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1391248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcIsac_SetEncSampRate(ISACSWB_inst[k], 32000); 1392248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1393248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: Couldn't set sample rate for iSAC SWB instance\n"); 1394248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1395248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1396248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_EncoderInit(ISACSWB_inst[k], 1); 1397248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((bitrate < 32000) || (bitrate > 56000)) { 13982a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC SWB bitrate has to be between 32000 and " 13992a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "56000 bps (not %i)\n", bitrate); 1400248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1401248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1402dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting WebRtcIsac_Control(ISACSWB_inst[k], bitrate, 1403dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting static_cast<int>(enc_frameSize >> 5)); 1404248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 14052a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - iSAC SWB only supports 960 enc_frameSize (30 " 14062a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "ms)\n"); 1407248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1408d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1409d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1410d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1411d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 1412248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting case webrtc::kDecoderGSMFR: 1413248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (sampfreq == 8000) { 1414248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ok = WebRtcGSMFR_CreateEnc(&GSMFRenc_inst[k]); 1415248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 14162a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("Error: Couldn't allocate memory for GSM FR encoding " 14172a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "instance\n"); 1418d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1419248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1420248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if ((enc_frameSize == 160) || (enc_frameSize == 320) || 1421248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (enc_frameSize == 480)) { 1422248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 14232a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting printf("\nError - GSM FR must have a multiple of 160 " 14242a10087d5e88a05f71c2c3c224e658ec5bbf4fa4Peter Kasting "enc_frameSize\n"); 1425248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1426248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1427248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0); 1428248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1429248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("\nError - GSM FR is only developed for 8kHz \n"); 1430248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1431d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1432d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1433d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1434cb23c0d9840a0f48921426cd777c2359bf917300minyue#ifdef CODEC_OPUS 1435cb23c0d9840a0f48921426cd777c2359bf917300minyue case webrtc::NetEqDecoder::kDecoderOpus: 1436cb23c0d9840a0f48921426cd777c2359bf917300minyue ok = WebRtcOpus_EncoderCreate(&opus_inst[k], 1, 0); 1437cb23c0d9840a0f48921426cd777c2359bf917300minyue if (ok != 0) { 1438cb23c0d9840a0f48921426cd777c2359bf917300minyue printf("Error: Couldn't allocate memory for Opus encoding " 1439cb23c0d9840a0f48921426cd777c2359bf917300minyue "instance\n"); 1440cb23c0d9840a0f48921426cd777c2359bf917300minyue exit(0); 1441cb23c0d9840a0f48921426cd777c2359bf917300minyue } 1442cb23c0d9840a0f48921426cd777c2359bf917300minyue WebRtcOpus_EnableFec(opus_inst[k]); 1443cb23c0d9840a0f48921426cd777c2359bf917300minyue WebRtcOpus_SetPacketLossRate(opus_inst[k], 5); 1444cb23c0d9840a0f48921426cd777c2359bf917300minyue break; 1445cb23c0d9840a0f48921426cd777c2359bf917300minyue#endif 1446248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting default: 1447d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org printf("Error: unknown codec in call to NetEQTest_init_coders.\n"); 1448d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org exit(0); 1449d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org break; 1450248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1451248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (ok != 0) { 1452248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (ok); 1453248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1454248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } // end for 1455d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1456248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (0); 1457248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting} 1458d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1459dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingint NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels) { 1460dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting for (size_t k = 0; k < numChannels; k++) { 1461248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcVad_Free(VAD_inst[k]); 1462d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \ 1463248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48)) 1464248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcCng_FreeEnc(CNGenc_inst[k]); 1465d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1466d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1467248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting switch (coder) { 1468d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B 1469ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16B: 1470d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1471d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_WB 1472ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16Bwb: 1473d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1474d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_32KHZ 1475ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz: 1476d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1477d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B_48KHZ 1478ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz: 1479d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1480d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 1481ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCMu: 1482ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderPCMa: 1483d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1484248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // do nothing 1485248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1486d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729 1487ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG729: 1488248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG729_FreeEnc(G729enc_inst[k]); 1489248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1490d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1491d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G729_1 1492ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG729_1: 1493248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7291_Free(G729_1_inst[k]); 1494248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1495d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1496d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_8 1497ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderSPEEX_8: 1498248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcSpeex_FreeEnc(SPEEX8enc_inst[k]); 1499248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1500d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1501d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_SPEEX_16 1502ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderSPEEX_16: 1503248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcSpeex_FreeEnc(SPEEX16enc_inst[k]); 1504248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1505d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1506d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1507d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_16 1508ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG722_1_16: 1509248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_FreeEnc16(G722_1_16enc_inst[k]); 1510248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1511d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1512d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_24 1513ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG722_1_24: 1514248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_FreeEnc24(G722_1_24enc_inst[k]); 1515248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1516d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1517d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1_32 1518ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG722_1_32: 1519248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221_FreeEnc32(G722_1_32enc_inst[k]); 1520248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1521d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1522d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_24 1523ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG722_1C_24: 1524248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_FreeEnc24(G722_1C_24enc_inst[k]); 1525248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1526d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1527d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_32 1528ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG722_1C_32: 1529248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_FreeEnc32(G722_1C_32enc_inst[k]); 1530248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1531d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1532d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722_1C_48 1533ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG722_1C_48: 1534248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG7221C_FreeEnc48(G722_1C_48enc_inst[k]); 1535248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1536d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1537d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 1538ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderG722: 1539248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcG722_FreeEncoder(g722EncState[k]); 1540248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1541d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1542d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMR 1543ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderAMR: 1544248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmr_FreeEnc(AMRenc_inst[k]); 1545248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1546d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1547d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_AMRWB 1548ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderAMRWB: 1549248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcAmrWb_FreeEnc(AMRWBenc_inst[k]); 1550248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1551d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1552d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 1553ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderILBC: 1554248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIlbcfix_EncoderFree(iLBCenc_inst[k]); 1555248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1556d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1557d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC 1558ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderISAC: 1559248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_Free(ISAC_inst[k]); 1560248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1561d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1562d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef NETEQ_ISACFIX_CODEC 1563ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderISAC: 1564248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsacfix_Free(ISAC_inst[k]); 1565248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1566d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1567d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 1568ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderISACswb: 1569248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_Free(ISACSWB_inst[k]); 1570248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1571d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1572d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_GSMFR 1573ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg case webrtc::NetEqDecoder::kDecoderGSMFR: 1574248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]); 1575248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1576d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1577cb23c0d9840a0f48921426cd777c2359bf917300minyue#ifdef CODEC_OPUS 1578cb23c0d9840a0f48921426cd777c2359bf917300minyue case webrtc::NetEqDecoder::kDecoderOpus: 1579cb23c0d9840a0f48921426cd777c2359bf917300minyue WebRtcOpus_EncoderFree(opus_inst[k]); 1580cb23c0d9840a0f48921426cd777c2359bf917300minyue break; 1581cb23c0d9840a0f48921426cd777c2359bf917300minyue#endif 1582248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting default: 1583248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: unknown codec in call to NetEQTest_init_coders.\n"); 1584248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1585248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting break; 1586d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1587248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1588d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1589248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (0); 1590d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1591d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1592ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwibergsize_t NetEQTest_encode(webrtc::NetEqDecoder coder, 1593dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int16_t* indata, 1594dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t frameLen, 1595dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting unsigned char* encoded, 1596dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int sampleRate, 1597dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int* vad, 1598dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int useVAD, 1599dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int bitrate, 1600dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t numChannels) { 1601dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t cdlen = 0; 1602248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t* tempdata; 1603248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting static int first_cng = 1; 1604dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t tempLen; 1605248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *vad = 1; 1606248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1607248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // check VAD first 1608248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (useVAD) { 1609248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *vad = 0; 1610248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1611dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t sampleRate_10 = static_cast<size_t>(10 * sampleRate / 1000); 1612dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t sampleRate_20 = static_cast<size_t>(20 * sampleRate / 1000); 1613dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t sampleRate_30 = static_cast<size_t>(30 * sampleRate / 1000); 1614dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting for (size_t k = 0; k < numChannels; k++) { 1615248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempLen = frameLen; 1616248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempdata = &indata[k * frameLen]; 1617248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int localVad = 0; 1618248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* Partition the signal and test each chunk for VAD. 1619dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting All chunks must be VAD=0 to produce a total VAD=0. */ 1620b297c5a01f88219da26cffe433804963d1b70f0fpkasting while (tempLen >= sampleRate_10) { 1621b297c5a01f88219da26cffe433804963d1b70f0fpkasting if ((tempLen % sampleRate_30) == 0) { // tempLen is multiple of 30ms 1622248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata, 1623b297c5a01f88219da26cffe433804963d1b70f0fpkasting sampleRate_30); 1624b297c5a01f88219da26cffe433804963d1b70f0fpkasting tempdata += sampleRate_30; 1625b297c5a01f88219da26cffe433804963d1b70f0fpkasting tempLen -= sampleRate_30; 1626b297c5a01f88219da26cffe433804963d1b70f0fpkasting } else if (tempLen >= sampleRate_20) { // tempLen >= 20ms 1627248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata, 1628b297c5a01f88219da26cffe433804963d1b70f0fpkasting sampleRate_20); 1629b297c5a01f88219da26cffe433804963d1b70f0fpkasting tempdata += sampleRate_20; 1630b297c5a01f88219da26cffe433804963d1b70f0fpkasting tempLen -= sampleRate_20; 1631248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { // use 10ms 1632248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata, 1633b297c5a01f88219da26cffe433804963d1b70f0fpkasting sampleRate_10); 1634b297c5a01f88219da26cffe433804963d1b70f0fpkasting tempdata += sampleRate_10; 1635b297c5a01f88219da26cffe433804963d1b70f0fpkasting tempLen -= sampleRate_10; 1636d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1637248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1638d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1639248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // aggregate all VAD decisions over all channels 1640248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *vad |= localVad; 1641248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1642d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1643248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (!*vad) { 1644248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // all channels are silent 1645248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = 0; 1646dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting for (size_t k = 0; k < numChannels; k++) { 1647248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcCng_Encode(CNGenc_inst[k], &indata[k * frameLen], 1648248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting (frameLen <= 640 ? frameLen : 640) /* max 640 */, 1649248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting encoded, &tempLen, first_cng); 1650248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting encoded += tempLen; 1651248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen += tempLen; 1652248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1653248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *vad = 0; 1654248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting first_cng = 0; 1655248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (cdlen); 1656248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1657248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1658d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1659248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // loop over all channels 1660dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting size_t totalLen = 0; 1661d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1662dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting for (size_t k = 0; k < numChannels; k++) { 1663248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* Encode with the selected coder type */ 1664ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg if (coder == webrtc::NetEqDecoder::kDecoderPCMu) { /*g711 u-law */ 1665d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 1666248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcG711_EncodeU(indata, frameLen, encoded); 1667d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1668ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg } else if (coder == webrtc::NetEqDecoder::kDecoderPCMa) { /*g711 A-law */ 1669d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G711 1670248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcG711_EncodeA(indata, frameLen, encoded); 1671248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1672d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1673d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_PCM16B 1674ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg else if ((coder == webrtc::NetEqDecoder::kDecoderPCM16B) || 1675ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg (coder == webrtc::NetEqDecoder::kDecoderPCM16Bwb) || 1676ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg (coder == webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz) || 1677ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg (coder == webrtc::NetEqDecoder:: 1678248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting kDecoderPCM16Bswb48kHz)) { /*pcm16b (8kHz, 16kHz, 1679ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg 32kHz or 48kHz) */ 1680248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcPcm16b_Encode(indata, frameLen, encoded); 1681248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1682d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1683d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_G722 1684ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg else if (coder == webrtc::NetEqDecoder::kDecoderG722) { /*g722 */ 1685248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting cdlen = WebRtcG722_Encode(g722EncState[k], indata, frameLen, encoded); 1686248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting assert(cdlen == frameLen >> 1); 1687248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1688d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1689d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ILBC 1690ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg else if (coder == webrtc::NetEqDecoder::kDecoderILBC) { /*iLBC */ 1691dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting cdlen = static_cast<size_t>(std::max( 1692dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting WebRtcIlbcfix_Encode(iLBCenc_inst[k], indata, frameLen, encoded), 0)); 1693248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1694d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1695248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting#if (defined(CODEC_ISAC) || \ 1696248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting defined(NETEQ_ISACFIX_CODEC)) // TODO(hlundin): remove all 1697248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // NETEQ_ISACFIX_CODEC 1698ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg else if (coder == webrtc::NetEqDecoder::kDecoderISAC) { /*iSAC */ 1699248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int noOfCalls = 0; 1700dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int res = 0; 1701dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting while (res <= 0) { 1702d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC /* floating point */ 1703dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting res = 1704248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting WebRtcIsac_Encode(ISAC_inst[k], &indata[noOfCalls * 160], encoded); 1705d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#else /* fixed point */ 1706dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting res = WebRtcIsacfix_Encode(ISAC_inst[k], &indata[noOfCalls * 160], 1707dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting encoded); 1708d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1709248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting noOfCalls++; 1710248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1711dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting cdlen = static_cast<size_t>(res); 1712248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1713d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1714d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#ifdef CODEC_ISAC_SWB 1715ee1879ca40ffe4af9bb9613e03eacc5c2c4881fckwiberg else if (coder == webrtc::NetEqDecoder::kDecoderISACswb) { /* iSAC SWB */ 1716248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int noOfCalls = 0; 1717dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int res = 0; 1718dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting while (res <= 0) { 1719dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting res = WebRtcIsac_Encode(ISACSWB_inst[k], &indata[noOfCalls * 320], 1720dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting encoded); 1721248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting noOfCalls++; 1722248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1723dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting cdlen = static_cast<size_t>(res); 1724248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1725d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org#endif 1726cb23c0d9840a0f48921426cd777c2359bf917300minyue#ifdef CODEC_OPUS 1727cb23c0d9840a0f48921426cd777c2359bf917300minyue cdlen = WebRtcOpus_Encode(opus_inst[k], indata, frameLen, kRtpDataSize - 12, 1728cb23c0d9840a0f48921426cd777c2359bf917300minyue encoded); 1729cb23c0d9840a0f48921426cd777c2359bf917300minyue RTC_CHECK_GT(cdlen, 0u); 1730cb23c0d9840a0f48921426cd777c2359bf917300minyue#endif 1731248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting indata += frameLen; 1732248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting encoded += cdlen; 1733248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting totalLen += cdlen; 1734d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1735248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } // end for 1736d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1737248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting first_cng = 1; 1738248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (totalLen); 1739d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1740d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1741d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgvoid makeRTPheader(unsigned char* rtp_data, 1742d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int payloadType, 1743d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int seqNo, 1744d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t timestamp, 1745d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t ssrc) { 1746248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[0] = 0x80; 1747248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[1] = payloadType & 0xFF; 1748248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[2] = (seqNo >> 8) & 0xFF; 1749248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[3] = seqNo & 0xFF; 1750248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[4] = timestamp >> 24; 1751248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[5] = (timestamp >> 16) & 0xFF; 1752248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[6] = (timestamp >> 8) & 0xFF; 1753248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[7] = timestamp & 0xFF; 1754248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[8] = ssrc >> 24; 1755248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[9] = (ssrc >> 16) & 0xFF; 1756248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[10] = (ssrc >> 8) & 0xFF; 1757248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtp_data[11] = ssrc & 0xFF; 1758d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1759d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1760d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.orgint makeRedundantHeader(unsigned char* rtp_data, 1761d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int* payloadType, 1762d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int numPayloads, 1763d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint32_t* timestamp, 1764d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org uint16_t* blockLen, 1765d324546ced76d4e792338af4f7d02a5cd8819f92pkasting@chromium.org int seqNo, 1766248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint32_t ssrc) { 1767248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int i; 1768248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char* rtpPointer; 1769248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting uint16_t offset; 1770248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1771248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* first create "standard" RTP header */ 1772248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting makeRTPheader(rtp_data, NETEQ_CODEC_RED_PT, seqNo, timestamp[numPayloads - 1], 1773248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ssrc); 1774248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1775248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer = &rtp_data[12]; 1776248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1777248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting /* add one sub-header for each redundant payload (not the primary) */ 1778248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting for (i = 0; i < numPayloads - 1; i++) { 1779248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (blockLen[i] > 0) { 1780248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting offset = static_cast<uint16_t>(timestamp[numPayloads - 1] - timestamp[i]); 1781248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1782248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // Byte |0| |1 2 | 3 | 1783248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // Bit |0|1234567|01234567012345|6701234567| 1784248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // |F|payload| timestamp | block | 1785248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // | | type | offset | length | 1786248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[0] = (payloadType[i] & 0x7F) | 0x80; 1787248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[1] = (offset >> 6) & 0xFF; 1788248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[2] = ((offset & 0x3F) << 2) | ((blockLen[i] >> 8) & 0x03); 1789248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[3] = blockLen[i] & 0xFF; 1790248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting 1791248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer += 4; 1792d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org } 1793248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1794d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1795248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // Bit |0|1234567| 1796248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // |0|payload| 1797248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // | | type | 1798248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting rtpPointer[0] = payloadType[numPayloads - 1] & 0x7F; 1799248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ++rtpPointer; 1800d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1801248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return rtpPointer - rtp_data; // length of header in bytes 1802d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1803d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1804dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingsize_t makeDTMFpayload(unsigned char* payload_data, 1805dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int Event, 1806dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int End, 1807dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int Volume, 1808dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting int Duration) { 1809248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char E, R, V; 1810248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting R = 0; 1811248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting V = (unsigned char)Volume; 1812248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (End == 0) { 1813248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting E = 0x00; 1814248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } else { 1815248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting E = 0x80; 1816248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1817248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload_data[0] = (unsigned char)Event; 1818248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload_data[1] = (unsigned char)(E | R | V); 1819248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // Duration equals 8 times time_ms, default is 8000 Hz. 1820248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload_data[2] = (unsigned char)((Duration >> 8) & 0xFF); 1821248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting payload_data[3] = (unsigned char)(Duration & 0xFF); 1822248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return (4); 1823d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1824d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1825dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingvoid stereoDeInterleave(int16_t* audioSamples, size_t numSamples) { 1826248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t* tempVec; 1827248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting int16_t* readPtr, *writeL, *writeR; 1828d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1829dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting if (numSamples == 0) 1830248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting return; 1831d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1832248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting tempVec = (int16_t*)malloc(sizeof(int16_t) * numSamples); 1833248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (tempVec == NULL) { 1834248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error allocating memory\n"); 1835248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1836248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1837d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1838248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(tempVec, audioSamples, numSamples * sizeof(int16_t)); 1839d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1840248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting writeL = audioSamples; 1841248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting writeR = &audioSamples[numSamples / 2]; 1842248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting readPtr = tempVec; 1843d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1844dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting for (size_t k = 0; k < numSamples; k += 2) { 1845248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *writeL = *readPtr; 1846248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting readPtr++; 1847248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting *writeR = *readPtr; 1848248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting readPtr++; 1849248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting writeL++; 1850248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting writeR++; 1851248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1852d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1853248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting free(tempVec); 1854d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1855d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1856dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kastingvoid stereoInterleave(unsigned char* data, size_t dataLen, size_t stride) { 1857248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char* ptrL, *ptrR; 1858248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting unsigned char temp[10]; 1859d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1860248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (stride > 10) { 1861248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1862248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1863d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1864248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting if (dataLen % 1 != 0) { 1865248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // must be even number of samples 1866248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting printf("Error: cannot interleave odd sample number\n"); 1867248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting exit(0); 1868248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1869d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1870248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ptrL = data + stride; 1871248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ptrR = &data[dataLen / 2]; 1872d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1873248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting while (ptrL < ptrR) { 1874248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // copy from right pointer to temp 1875248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(temp, ptrR, stride); 1876d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1877248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // shift data between pointers 1878248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memmove(ptrL + stride, ptrL, ptrR - ptrL); 1879d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1880248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // copy from temp to left pointer 1881248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting memcpy(ptrL, temp, stride); 1882d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org 1883248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting // advance pointers 1884248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ptrL += stride * 2; 1885248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting ptrR += stride; 1886248b0b079091bde4ac660b117d27bb9d3d7ca980Peter Kasting } 1887d94659dc279b86376c1a6470dc326fd342caaa93henrik.lundin@webrtc.org} 1888