Bug 1245216: Avoid reallocating and leaking AudioPacketizer output buffer r?padenot
--- a/dom/media/webrtc/MediaEngineWebRTC.h
+++ b/dom/media/webrtc/MediaEngineWebRTC.h
@@ -9,16 +9,17 @@
#include "prthread.h"
#include "prprf.h"
#include "nsIThread.h"
#include "nsIRunnable.h"
#include "mozilla/dom/File.h"
#include "mozilla/Mutex.h"
#include "mozilla/Monitor.h"
+#include "mozilla/UniquePtr.h"
#include "nsCOMPtr.h"
#include "nsThreadUtils.h"
#include "DOMMediaStream.h"
#include "nsDirectoryServiceDefs.h"
#include "nsComponentManagerUtils.h"
#include "nsRefPtrHashtable.h"
#include "VideoUtils.h"
@@ -420,17 +421,18 @@ public:
, mInitDone(false)
, mStarted(false)
, mSampleFrequency(MediaEngine::DEFAULT_SAMPLE_RATE)
, mEchoOn(false), mAgcOn(false), mNoiseOn(false)
, mEchoCancel(webrtc::kEcDefault)
, mAGC(webrtc::kAgcDefault)
, mNoiseSuppress(webrtc::kNsDefault)
, mPlayoutDelay(0)
- , mNullTransport(nullptr) {
+ , mNullTransport(nullptr)
+ , mInputBufferLen(0) {
MOZ_ASSERT(aVoiceEnginePtr);
MOZ_ASSERT(aAudioInput);
mDeviceName.Assign(NS_ConvertUTF8toUTF16(name));
mDeviceUUID.Assign(uuid);
mListener = new mozilla::WebRTCAudioDataListener(this);
Init();
}
@@ -523,16 +525,20 @@ private:
uint32_t mSampleFrequency;
bool mEchoOn, mAgcOn, mNoiseOn;
webrtc::EcModes mEchoCancel;
webrtc::AgcModes mAGC;
webrtc::NsModes mNoiseSuppress;
int32_t mPlayoutDelay;
NullTransport *mNullTransport;
+
+ // For full_duplex packetizer output
+ size_t mInputBufferLen;
+ UniquePtr<int16_t[]> mInputBuffer;
};
class MediaEngineWebRTC : public MediaEngine
{
public:
explicit MediaEngineWebRTC(MediaEnginePrefs& aPrefs);
// Clients should ensure to clean-up sources video/audio sources
--- a/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
+++ b/dom/media/webrtc/MediaEngineWebRTCAudio.cpp
@@ -463,17 +463,21 @@ MediaEngineWebRTCMicrophoneSource::Notif
mPacketizer = new AudioPacketizer<AudioDataValue, int16_t>(aRate/100, aChannels);
}
mPacketizer->Input(aBuffer, static_cast<uint32_t>(aFrames));
while (mPacketizer->PacketsAvailable()) {
uint32_t samplesPerPacket = mPacketizer->PacketSize() *
mPacketizer->Channels();
- int16_t* packet = mPacketizer->Output();
+ if (mInputBufferLen < samplesPerPacket) {
+ mInputBuffer = MakeUnique<int16_t[]>(samplesPerPacket);
+ }
+ int16_t *packet = mInputBuffer.get();
+ mPacketizer->Output(packet);
mVoERender->ExternalRecordingInsertData(packet, samplesPerPacket, aRate, 0);
}
}
void
MediaEngineWebRTCMicrophoneSource::Init()
{