diff --git a/src/engine/agent/Agent_Impl.cpp b/src/engine/agent/Agent_Impl.cpp index 277a1e02..e4edb8a5 100644 --- a/src/engine/agent/Agent_Impl.cpp +++ b/src/engine/agent/Agent_Impl.cpp @@ -208,10 +208,13 @@ void AgentImpl::processStart(JsonCpp::Value& /*request*/, JsonCpp::Value &answer PVariantMap priorityConfig = std::make_shared(); MT::CodecList& cl = mTerminal->codeclist(); for (int i=0; iat(i) = i; + + // Disable dynamic payload codec types - commented for now + /*if (cl.codecAt(i).payloadType() < 96) priorityConfig->at(i) = i; else - priorityConfig->at(i) = -1; + priorityConfig->at(i) = -1;*/ config()[CONFIG_CODEC_PRIORITY] = priorityConfig; diff --git a/src/engine/audio/Audio_Resampler.cpp b/src/engine/audio/Audio_Resampler.cpp index 59a7f474..6794a33b 100644 --- a/src/engine/audio/Audio_Resampler.cpp +++ b/src/engine/audio/Audio_Resampler.cpp @@ -154,7 +154,7 @@ int ChannelConverter::stereoToMono(const void *source, int sourceLength, void *d int ChannelConverter::monoToStereo(const void *source, int sourceLength, void *dest, int destLength) { - assert(destLength == sourceLength * 2); + assert (destLength == sourceLength * 2); const short* input = (const short*)source; short* output = (short*)dest; // Convert starting from the end of buffer to allow inplace conversion diff --git a/src/engine/config.h b/src/engine/config.h index a187f262..9d736550 100644 --- a/src/engine/config.h +++ b/src/engine/config.h @@ -84,7 +84,7 @@ // OPUS codec defines // #define USE_OPUS_CODEC -#define MT_OPUS_CODEC_PT -1 +#define MT_OPUS_CODEC_PT 106 // ILBC codec defines #define MT_ILBC20_PAYLOADTYPE -1 diff --git a/src/engine/endpoint/EP_AudioProvider.cpp b/src/engine/endpoint/EP_AudioProvider.cpp index cfbb3793..334dc624 100644 --- a/src/engine/endpoint/EP_AudioProvider.cpp +++ b/src/engine/endpoint/EP_AudioProvider.cpp @@ -26,7 +26,7 @@ AudioProvider::AudioProvider(UserAgent& agent, MT::Terminal& terminal) if (mUserAgent.config().exists(CONFIG_CODEC_PRIORITY)) mCodecPriority.setupFrom(mUserAgent.config()[CONFIG_CODEC_PRIORITY].asVMap()); mSrtpSuite = SRTP_NONE; - setState((int)StreamState::SipRecv | (int)StreamState::SipSend | (int)StreamState::Receiving | (int)StreamState::Sending); + setStateImpl((int)StreamState::SipRecv | (int)StreamState::SipSend | (int)StreamState::Receiving | (int)StreamState::Sending); } AudioProvider::~AudioProvider() @@ -182,6 +182,7 @@ void AudioProvider::sessionEstablished(int conntype) { RemoteCodec& rc = mAvailableCodecs.front(); mActiveStream->setTransmittingCodec(*rc.mFactory, rc.mRemotePayloadType); + auto codec = dynamic_cast(mActiveStream.get())->transmittingCodec(); dynamic_cast(mActiveStream.get())->setTelephoneCodec(mRemoteTelephoneCodec); } } @@ -271,11 +272,10 @@ bool AudioProvider::processSdpOffer(const resip::SdpContents::Session::Medium& m return true; } + void AudioProvider::setState(unsigned state) { - mState = state; - if (mActiveStream) - mActiveStream->setState(state); + setStateImpl(state); } unsigned AudioProvider::state() @@ -381,3 +381,10 @@ void AudioProvider::setupMirror(bool enable) if (mActiveStream) mActiveStream->setupMirror(enable); } + +void AudioProvider::setStateImpl(unsigned int state) { + mState = state; + if (mActiveStream) + mActiveStream->setState(state); + +} \ No newline at end of file diff --git a/src/engine/endpoint/EP_AudioProvider.h b/src/engine/endpoint/EP_AudioProvider.h index 5baddea3..f490cf00 100644 --- a/src/engine/endpoint/EP_AudioProvider.h +++ b/src/engine/endpoint/EP_AudioProvider.h @@ -64,8 +64,9 @@ public: // Returns true if description is processed succesfully. Otherwise method returns false. // myAnswer sets if the answer will be sent after. bool processSdpOffer(const resip::SdpContents::Session::Medium& media, SdpDirection sdpDirection); - - void setState(unsigned state); + + + void setState(unsigned state) override; unsigned state(); MT::Statistics getStatistics(); MT::PStream activeStream(); @@ -112,6 +113,10 @@ protected: std::string createCryptoAttribute(SrtpSuite suite); SrtpSuite processCryptoAttribute(const resip::Data& value, ByteBuffer& key); void findRfc2833(const resip::SdpContents::Session::Medium::CodecContainer& codecs); + + // Implements setState() logic. This allows to be called from constructor (it is not virtual function) + void setStateImpl(unsigned state); + }; #endif diff --git a/src/engine/endpoint/EP_Session.cpp b/src/engine/endpoint/EP_Session.cpp index aa53ad57..773fa0ed 100644 --- a/src/engine/endpoint/EP_Session.cpp +++ b/src/engine/endpoint/EP_Session.cpp @@ -726,7 +726,7 @@ void Session::buildSdp(resip::SdpContents &sdp, SdpDirection sdpDirection) if (mUserAgent->mConfig[CONFIG_MULTIPLEXING].asBool()) media.addAttribute("rtcp-mux"); - // Ask provider about specific information + // Ask provider about specific information - codecs are filled here provider.updateSdpOffer(media, sdpDirection); // Add ICE information diff --git a/src/engine/media/MT_AudioCodec.cpp b/src/engine/media/MT_AudioCodec.cpp index 0fd46d70..7b45f7af 100644 --- a/src/engine/media/MT_AudioCodec.cpp +++ b/src/engine/media/MT_AudioCodec.cpp @@ -402,6 +402,7 @@ PCodec OpusCodec::OpusFactory::create() result->applyParams(mParams); PCodec c(result); mCodecList.push_back(c); + return c; } diff --git a/src/engine/media/MT_AudioStream.cpp b/src/engine/media/MT_AudioStream.cpp index e6561463..423b43bc 100644 --- a/src/engine/media/MT_AudioStream.cpp +++ b/src/engine/media/MT_AudioStream.cpp @@ -110,6 +110,7 @@ void AudioStream::setDestination(const RtpPair& dest) void AudioStream::setTransmittingCodec(Codec::Factory& factory, int payloadType) { ICELogInfo(<< "Selected codec " << factory.name() << "/" << factory.samplerate() << " for transmitting"); + Lock l(mMutex); mTransmittingCodec = factory.create(); mTransmittingPayloadType = payloadType; @@ -145,8 +146,10 @@ void AudioStream::addData(const void* buffer, int bytes) { Lock l(mMutex); codec = mTransmittingCodec.get(); - if (!codec) + if (nullptr == codec) { + ICELogDebug(<< "No transmitting codec selected."); return; + } } // Resample @@ -202,7 +205,7 @@ void AudioStream::addData(const void* buffer, int bytes) int packetTime = mPacketTime ? mPacketTime : codec->frameTime(); // Make stereo version if required - for (int i=0; ipcmLength(); i++) + for (int i=0; ipcmLength(); i++) { if (mSendingDump) mSendingDump->write((const char*)mCapturedAudio.data() + codec->pcmLength() * i, codec->pcmLength()); @@ -230,7 +233,8 @@ void AudioStream::addData(const void* buffer, int bytes) } } } - mCapturedAudio.erase(processed); + if (processed > 0) + mCapturedAudio.erase(processed); } void AudioStream::copyDataTo(Audio::Mixer& mixer, int needed) diff --git a/src/engine/media/MT_AudioStream.h b/src/engine/media/MT_AudioStream.h index 32b22e03..bb6a7eea 100644 --- a/src/engine/media/MT_AudioStream.h +++ b/src/engine/media/MT_AudioStream.h @@ -64,7 +64,7 @@ namespace MT Audio::DataWindow mStereoCapturedAudio; char mIncomingPcmBuffer[AUDIO_MIC_BUFFER_SIZE]; // Temporary buffer to allow reading from file char mResampleBuffer[AUDIO_MIC_BUFFER_SIZE*8]; // Temporary buffer to hold data - char mStereoBuffer[AUDIO_MIC_BUFFER_SIZE*8]; // Temporary buffer to hold data converted to stereo + char mStereoBuffer[AUDIO_MIC_BUFFER_SIZE*16]; // Temporary buffer to hold data converted to stereo PCodec mTransmittingCodec; // Current encoding codec int mTransmittingPayloadType; // Payload type to mark outgoing packets int mPacketTime; // Required packet time diff --git a/src/engine/media/MT_CodecList.cpp b/src/engine/media/MT_CodecList.cpp index 1475d59c..e2b8d3c2 100644 --- a/src/engine/media/MT_CodecList.cpp +++ b/src/engine/media/MT_CodecList.cpp @@ -128,12 +128,12 @@ CodecList::CodecList(const Settings& settings) //mFactoryList.push_back(new IsacCodec::IsacFactory16K(mSettings.mIsac16KPayloadType)); //mFactoryList.push_back(new IlbcCodec::IlbcFactory(mSettings.mIlbc20PayloadType, mSettings.mIlbc30PayloadType)); - mFactoryList.push_back(new G711Codec::AlawFactory()); - mFactoryList.push_back(new G711Codec::UlawFactory()); + // mFactoryList.push_back(new G711Codec::AlawFactory()); + // mFactoryList.push_back(new G711Codec::UlawFactory()); - mFactoryList.push_back(new GsmCodec::GsmFactory(mSettings.mGsmFrPayloadLength == 32 ? GsmCodec::Type::Bytes_32 : GsmCodec::Type::Bytes_33, mSettings.mGsmFrPayloadType)); - mFactoryList.push_back(new G722Codec::G722Factory()); - mFactoryList.push_back(new G729Codec::G729Factory()); + // mFactoryList.push_back(new GsmCodec::GsmFactory(mSettings.mGsmFrPayloadLength == 32 ? GsmCodec::Type::Bytes_32 : GsmCodec::Type::Bytes_33, mSettings.mGsmFrPayloadType)); + // mFactoryList.push_back(new G722Codec::G722Factory()); + // mFactoryList.push_back(new G729Codec::G729Factory()); #ifndef TARGET_ANDROID mFactoryList.push_back(new GsmHrCodec::GsmHrFactory(mSettings.mGsmHrPayloadType)); #endif @@ -231,7 +231,7 @@ void CodecListPriority::setupFrom(PVariantMap vmap) { Item item; item.mCodecIndex = i; - item.mPriority = vmap->exists(i) ? vmap->at(i).asInt() : -1; + item.mPriority = vmap->exists(i) ? vmap->at(i).asInt() : 1000; // Non listed codecs will get lower priority mPriorityList.push_back(item); } diff --git a/src/engine/media/MT_Stream.h b/src/engine/media/MT_Stream.h index 0e136d6a..e517de9f 100644 --- a/src/engine/media/MT_Stream.h +++ b/src/engine/media/MT_Stream.h @@ -52,7 +52,7 @@ namespace MT virtual void setDestination(const RtpPair& dest); - virtual void setTransmittingCodec(Codec::Factory& factory, int payloadType) = 0; + virtual void setTransmittingCodec(Codec::Factory& factory, int payloadType) = 0; virtual void dataArrived(PDatagramSocket s, const void* buffer, int length, InternetAddress& source) = 0;