Bug 1245216: Avoid reallocating and leaking AudioPacketizer output buffer r?padenot draft
authorRandell Jesup <rjesup@jesup.org>
Thu, 04 Feb 2016 12:40:14 -0500
changeset 328919 12d3ad1f9f899a7548dbe3ff1de47ccefa80632f
parent 328918 b2a56a553cf70301d21127c8b9a83d939a739fa7
child 513874 aeb1c01fdb191709b22a83a51040d2ede4e5abef
push id10433
push userrjesup@wgate.com
push dateThu, 04 Feb 2016 17:45:17 +0000
reviewerspadenot
bugs1245216
milestone47.0a1
Bug 1245216: Avoid reallocating and leaking AudioPacketizer output buffer r?padenot
dom/media/webrtc/MediaEngineWebRTC.h
dom/media/webrtc/MediaEngineWebRTCAudio.cpp
--- 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()
 {