Changes to solve warnings on Mac, issue #178.
Review URL: http://webrtc-codereview.appspot.com/320005

git-svn-id: http://webrtc.googlecode.com/svn/trunk@1216 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/src/modules/audio_coding/main/test/EncodeDecodeTest.cpp b/src/modules/audio_coding/main/test/EncodeDecodeTest.cpp
index d46fa87..7670e2a 100644
--- a/src/modules/audio_coding/main/test/EncodeDecodeTest.cpp
+++ b/src/modules/audio_coding/main/test/EncodeDecodeTest.cpp
@@ -10,296 +10,401 @@
 
 #include "EncodeDecodeTest.h"
 
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
+#include "audio_coding_module.h"
 #include "common_types.h"
 #include "gtest/gtest.h"
 #include "trace.h"
 #include "utility.h"
 
-Receiver::Receiver()
-:
-_playoutLengthSmpls(WEBRTC_10MS_PCM_AUDIO),
-_payloadSizeBytes(MAX_INCOMING_PAYLOAD)
-{
+namespace webrtc {
+
+TestPacketization::TestPacketization(RTPStream *rtpStream,
+                                     WebRtc_UWord16 frequency)
+    : _rtpStream(rtpStream),
+      _frequency(frequency),
+      _seqNo(0) {
 }
 
-void Receiver::Setup(AudioCodingModule *acm, RTPStream *rtpStream)
-{
-    struct CodecInst recvCodec;
-    int noOfCodecs;
-    acm->InitializeReceiver();
+TestPacketization::~TestPacketization() { }
 
-    noOfCodecs = acm->NumberOfCodecs();
-    for (int i=0; i < noOfCodecs; i++)
-    {
-        acm->Codec((WebRtc_UWord8)i, recvCodec);      
-        if (acm->RegisterReceiveCodec(recvCodec) != 0)
-        {
-            printf("Unable to register codec: for run: codecId: %d\n", codeId);
-            exit(1);
-        }
-    }
-     
-    char filename[128];
-    _rtpStream = rtpStream;
-    int playSampFreq;
+WebRtc_Word32 TestPacketization::SendData(
+    const FrameType /* frameType */,
+    const WebRtc_UWord8 payloadType,
+    const WebRtc_UWord32 timeStamp,
+    const WebRtc_UWord8* payloadData,
+    const WebRtc_UWord16 payloadSize,
+    const RTPFragmentationHeader* /* fragmentation */) {
+  _rtpStream->Write(payloadType, timeStamp, _seqNo++, payloadData, payloadSize,
+                    _frequency);
+  return 1;
+}
 
-    if (testMode == 1)
-    {
-      playSampFreq=recvCodec.plfreq;
-      //output file for current run
-      sprintf(filename,"./src/modules/audio_coding/main/test/out%dFile.pcm",codeId);
-      _pcmFile.Open(filename, recvCodec.plfreq, "wb+");
+Sender::Sender()
+    : _acm(NULL),
+      _pcmFile(),
+      _audioFrame(),
+      _payloadSize(0),
+      _timeStamp(0),
+      _packetization(NULL) {
+}
+
+void Sender::Setup(AudioCodingModule *acm, RTPStream *rtpStream) {
+  acm->InitializeSender();
+  struct CodecInst sendCodec;
+  int noOfCodecs = acm->NumberOfCodecs();
+  int codecNo;
+
+  if (testMode == 1) {
+    // Set the codec, input file, and parameters for the current test.
+    codecNo = codeId;
+    // Use same input file for now.
+    char fileName[] = "./test/data/audio_coding/testfile32kHz.pcm";
+    _pcmFile.Open(fileName, 32000, "rb");
+  } else if (testMode == 0) {
+    // Set the codec, input file, and parameters for the current test.
+    codecNo = codeId;
+    acm->Codec(codecNo, sendCodec);
+    // Use same input file for now.
+    char fileName[] = "./test/data/audio_coding/testfile32kHz.pcm";
+    _pcmFile.Open(fileName, 32000, "rb");
+  } else {
+    printf("List of supported codec.\n");
+    for (int n = 0; n < noOfCodecs; n++) {
+      acm->Codec(n, sendCodec);
+      printf("%d %s\n", n, sendCodec.plname);
     }
-    else if (testMode == 0)
-    {
-        playSampFreq=32000;
-      //output file for current run
-      sprintf(filename,"./src/modules/audio_coding/main/test/encodeDecode_out%d.pcm",codeId);
-      _pcmFile.Open(filename, 32000/*recvCodec.plfreq*/, "wb+");
-    }
-    else
-    {
-        printf("\nValid output frequencies:\n");
-        printf("8000\n16000\n32000\n-1, which means output freq equal to received signal freq");
-        printf("\n\nChoose output sampling frequency: ");
-        ASSERT_GT(scanf("%d", &playSampFreq), 0);
-        char fileName[] = "./src/modules/audio_coding/main/test/outFile.pcm";
-        _pcmFile.Open(fileName, 32000, "wb+");
-    }
-     
-    _realPayloadSizeBytes = 0;
-    _playoutBuffer = new WebRtc_Word16[WEBRTC_10MS_PCM_AUDIO];
-    _frequency = playSampFreq;
+    printf("Choose your codec:");
+    ASSERT_GT(scanf("%d", &codecNo), 0);
+    char fileName[] = "./test/data/audio_coding/testfile32kHz.pcm";
+    _pcmFile.Open(fileName, 32000, "rb");
+  }
+
+  acm->Codec(codecNo, sendCodec);
+  acm->RegisterSendCodec(sendCodec);
+  _packetization = new TestPacketization(rtpStream, sendCodec.plfreq);
+  if (acm->RegisterTransportCallback(_packetization) < 0) {
+    printf("Registering Transport Callback failed, for run: codecId: %d: --\n",
+           codeId);
+  }
+
     _acm = acm;
-    _firstTime = true;
+  }
+
+void Sender::Teardown() {
+  _pcmFile.Close();
+  delete _packetization;
 }
 
-void Receiver::Teardown()
-{
-    delete [] _playoutBuffer;
-    _pcmFile.Close();
-    if (testMode > 1) Trace::ReturnTrace();
-}
-
-bool Receiver::IncomingPacket()
-{
-    if (!_rtpStream->EndOfFile())
-    {
-        if (_firstTime)
-        {
-            _firstTime = false;
-            _realPayloadSizeBytes = _rtpStream->Read(&_rtpInfo, _incomingPayload, _payloadSizeBytes, &_nextTime);
-            if (_realPayloadSizeBytes == 0 && _rtpStream->EndOfFile())
-            {
-                _firstTime = true;
-                return true;
-            }
-        }
-        
-       WebRtc_Word32 ok = _acm->IncomingPacket(_incomingPayload, _realPayloadSizeBytes, _rtpInfo);
-        if (ok != 0)
-        {
-            printf("Error when inserting packet to ACM, for run: codecId: %d\n", codeId);
-            exit(1);
-        }
-        _realPayloadSizeBytes = _rtpStream->Read(&_rtpInfo, _incomingPayload, _payloadSizeBytes, &_nextTime);
-        if (_realPayloadSizeBytes == 0 && _rtpStream->EndOfFile())
-        {
-            _firstTime = true;
-        }
+bool Sender::Add10MsData() {
+  if (!_pcmFile.EndOfFile()) {
+    _pcmFile.Read10MsData(_audioFrame);
+    WebRtc_Word32 ok = _acm->Add10MsData(_audioFrame);
+    if (ok != 0) {
+      printf("Error calling Add10MsData: for run: codecId: %d\n", codeId);
+      exit(1);
     }
     return true;
+  }
+  return false;
 }
 
-bool Receiver::PlayoutData()
-{
-    AudioFrame audioFrame;
+bool Sender::Process() {
+  WebRtc_Word32 ok = _acm->Process();
+  if (ok < 0) {
+    printf("Error calling Add10MsData: for run: codecId: %d\n", codeId);
+    exit(1);
+  }
+  return true;
+}
 
-    if (_acm->PlayoutData10Ms(_frequency, audioFrame) != 0)
-    {
-        printf("Error when calling PlayoutData10Ms, for run: codecId: %d\n", codeId);
-        exit(1);
+void Sender::Run() {
+  while (true) {
+    if (!Add10MsData()) {
+      break;
     }
-    if (_playoutLengthSmpls == 0)
-    {
+    if (!Process()) { // This could be done in a processing thread
+      break;
+    }
+  }
+}
+
+Receiver::Receiver()
+    : _playoutLengthSmpls(WEBRTC_10MS_PCM_AUDIO),
+      _payloadSizeBytes(MAX_INCOMING_PAYLOAD) {
+}
+
+void Receiver::Setup(AudioCodingModule *acm, RTPStream *rtpStream) {
+  struct CodecInst recvCodec;
+  int noOfCodecs;
+  acm->InitializeReceiver();
+
+  noOfCodecs = acm->NumberOfCodecs();
+  for (int i = 0; i < noOfCodecs; i++) {
+    acm->Codec((WebRtc_UWord8) i, recvCodec);
+    if (acm->RegisterReceiveCodec(recvCodec) != 0) {
+      printf("Unable to register codec: for run: codecId: %d\n", codeId);
+      exit(1);
+    }
+  }
+     
+  char filename[128];
+  _rtpStream = rtpStream;
+  int playSampFreq;
+
+  if (testMode == 1) {
+    playSampFreq=recvCodec.plfreq;
+    //output file for current run
+    sprintf(filename,"./src/modules/audio_coding/main/test/out%dFile.pcm",
+            codeId);
+    _pcmFile.Open(filename, recvCodec.plfreq, "wb+");
+  } else if (testMode == 0) {
+    playSampFreq=32000;
+    //output file for current run
+    sprintf(filename,
+            "./src/modules/audio_coding/main/test/encodeDecode_out%d.pcm",
+            codeId);
+    _pcmFile.Open(filename, 32000/*recvCodec.plfreq*/, "wb+");
+  } else {
+    printf("\nValid output frequencies:\n");
+    printf("8000\n16000\n32000\n-1,");
+    printf("which means output freq equal to received signal freq");
+    printf("\n\nChoose output sampling frequency: ");
+    ASSERT_GT(scanf("%d", &playSampFreq), 0);
+    char fileName[] = "./src/modules/audio_coding/main/test/outFile.pcm";
+    _pcmFile.Open(fileName, 32000, "wb+");
+  }
+     
+  _realPayloadSizeBytes = 0;
+  _playoutBuffer = new WebRtc_Word16[WEBRTC_10MS_PCM_AUDIO];
+  _frequency = playSampFreq;
+  _acm = acm;
+  _firstTime = true;
+}
+
+void Receiver::Teardown() {
+  delete [] _playoutBuffer;
+  _pcmFile.Close();
+  if (testMode > 1)
+    Trace::ReturnTrace();
+}
+
+bool Receiver::IncomingPacket() {
+  if (!_rtpStream->EndOfFile()) {
+    if (_firstTime) {
+      _firstTime = false;
+      _realPayloadSizeBytes = _rtpStream->Read(&_rtpInfo, _incomingPayload,
+                                               _payloadSizeBytes, &_nextTime);
+      if (_realPayloadSizeBytes < 0) {
+        printf("Error in reading incoming payload.\n");
         return false;
-    }
-    _pcmFile.Write10MsData(audioFrame._payloadData, audioFrame._payloadDataLengthInSamples);
-    return true;
-}
-
-void Receiver::Run()
-{
-    WebRtc_UWord8 counter500Ms = 50;
-    
-    WebRtc_UWord32 clock = 0;
-
-    while (counter500Ms > 0)
-    {
-        if (clock == 0 || clock >= _nextTime)
-        {
-            IncomingPacket();
-            if (clock == 0)
-            {
-                clock = _nextTime;
-            }
-        }
-        if ((clock % 10) == 0)
-        {
-            if (!PlayoutData())
-            {
-                clock++;
-                continue;
-            }
-        }
-        if (_rtpStream->EndOfFile())
-        {
-            counter500Ms--;
-        }
-        clock++;
-    }
-}
-
-EncodeDecodeTest::EncodeDecodeTest()
-{
-    _testMode = 2;
-    Trace::CreateTrace();
-    Trace::SetTraceFile("acm_encdec_test.txt");
-}
-
-EncodeDecodeTest::EncodeDecodeTest(int testMode)
-{
-    //testMode == 0 for autotest
-    //testMode == 1 for testing all codecs/parameters
-    //testMode > 1 for specific user-input test (as it was used before)
-   _testMode = testMode;
-   if(_testMode != 0)
-   {
-       Trace::CreateTrace();
-       Trace::SetTraceFile("acm_encdec_test.txt");
+      }
+      if (_realPayloadSizeBytes == 0 && _rtpStream->EndOfFile()) {
+        _firstTime = true;
+        return true;
+     }
    }
-}
-void EncodeDecodeTest::Perform()
-{
 
-    if(_testMode == 0)
-    {
-        printf("Running Encode/Decode Test");
-        WEBRTC_TRACE(webrtc::kTraceStateInfo, webrtc::kTraceAudioCoding, -1, "---------- EncodeDecodeTest ----------");
+   WebRtc_Word32 ok = _acm->IncomingPacket(_incomingPayload,
+                                           _realPayloadSizeBytes, _rtpInfo);
+   if (ok != 0) {
+     printf("Error when inserting packet to ACM, for run: codecId: %d\n",
+            codeId);
+     exit(1);
+   }
+   _realPayloadSizeBytes = _rtpStream->Read(&_rtpInfo, _incomingPayload,
+                                            _payloadSizeBytes, &_nextTime);
+    if (_realPayloadSizeBytes == 0 && _rtpStream->EndOfFile()) {
+      _firstTime = true;
     }
-
-    int numCodecs = 1;
-    int codePars[3]; //freq, pacsize, rate     
-    int playoutFreq[3]; //8, 16, 32k   
-
-    int numPars[52]; //number of codec parameters sets (rate,freq,pacsize)to test, for a given codec                    
-        
-    codePars[0]=0;
-    codePars[1]=0;
-    codePars[2]=0;
-
-    if (_testMode == 1)
-    {
-        AudioCodingModule *acmTmp = AudioCodingModule::Create(0);
-        struct CodecInst sendCodecTmp;
-        numCodecs = acmTmp->NumberOfCodecs();
-        printf("List of supported codec.\n");
-        for(int n = 0; n < numCodecs; n++)
-        {
-            acmTmp->Codec(n, sendCodecTmp);
-            if (STR_CASE_CMP(sendCodecTmp.plname, "telephone-event") == 0) {
-                numPars[n] = 0;
-            } else if (STR_CASE_CMP(sendCodecTmp.plname, "cn") == 0) {
-                numPars[n] = 0;
-            } else if (STR_CASE_CMP(sendCodecTmp.plname, "red") == 0) {
-                numPars[n] = 0;
-            } else {
-                numPars[n] = 1;
-                printf("%d %s\n", n, sendCodecTmp.plname);
-            }
-        }
-        AudioCodingModule::Destroy(acmTmp);
-        playoutFreq[1]=16000;
-    }
-    else if (_testMode == 0)
-    {
-        AudioCodingModule *acmTmp = AudioCodingModule::Create(0);
-        numCodecs = acmTmp->NumberOfCodecs();
-        AudioCodingModule::Destroy(acmTmp);
-        struct CodecInst dummyCodec;
-
-        //chose range of testing for codecs/parameters
-        for(int i = 0 ; i < numCodecs ; i++)
-        {
-            numPars[i] = 1;
-            acmTmp->Codec(i, dummyCodec);
-            if (STR_CASE_CMP(dummyCodec.plname, "telephone-event") == 0)
-            {
-                numPars[i] = 0;
-            } else if (STR_CASE_CMP(dummyCodec.plname, "cn") == 0) {
-                numPars[i] = 0;
-            } else if (STR_CASE_CMP(dummyCodec.plname, "red") == 0) {
-                numPars[i] = 0;
-            }
-        }
-        playoutFreq[1] = 16000;
-    }
-    else 
-    {
-        numCodecs = 1;
-        numPars[0] = 1;
-        playoutFreq[1]=16000;
-    }
-
-    _receiver.testMode = _testMode;
-
-     //loop over all codecs:
-     for(int codeId=0;codeId<numCodecs;codeId++)
-     {
-         //only encode using real encoders, not telephone-event anc cn
-         for(int loopPars=1;loopPars<=numPars[codeId];loopPars++)
-         {
-             if (_testMode == 1)
-             {
-                 printf("\n");
-                 printf("***FOR RUN: codeId: %d\n",codeId);
-                 printf("\n");
-             }
-             else if (_testMode == 0)
-             {
-                 printf(".");
-             }
-
-             EncodeToFileTest::Perform(1, codeId, codePars, _testMode);
-
-             AudioCodingModule *acm = AudioCodingModule::Create(10);
-             RTPFile rtpFile;
-             char fileName[] = "outFile.rtp";
-             rtpFile.Open(fileName, "rb");
-
-             _receiver.codeId = codeId;
-
-             rtpFile.ReadHeader();
-             _receiver.Setup(acm, &rtpFile);
-             _receiver.Run();
-             _receiver.Teardown();
-             rtpFile.Close();
-             AudioCodingModule::Destroy(acm);
-
-             if (_testMode == 1)
-             {
-                 printf("***COMPLETED RUN FOR: codecID: %d ***\n",
-                     codeId);
-             }
-        }
-    }
-    if (_testMode == 0)
-    {
-        printf("Done!\n");
-    }
-    if (_testMode == 1) Trace::ReturnTrace();
+  }
+  return true;
 }
 
+bool Receiver::PlayoutData() {
+  AudioFrame audioFrame;
+
+  if (_acm->PlayoutData10Ms(_frequency, audioFrame) != 0) {
+    printf("Error when calling PlayoutData10Ms, for run: codecId: %d\n",
+           codeId);
+    exit(1);
+  }
+  if (_playoutLengthSmpls == 0) {
+    return false;
+  }
+  _pcmFile.Write10MsData(audioFrame._payloadData,
+                         audioFrame._payloadDataLengthInSamples);
+  return true;
+}
+
+void Receiver::Run() {
+  WebRtc_UWord8 counter500Ms = 50;
+  WebRtc_UWord32 clock = 0;
+
+  while (counter500Ms > 0) {
+    if (clock == 0 || clock >= _nextTime) {
+      IncomingPacket();
+      if (clock == 0) {
+        clock = _nextTime;
+      }
+    }
+    if ((clock % 10) == 0) {
+      if (!PlayoutData()) {
+        clock++;
+        continue;
+      }
+    }
+    if (_rtpStream->EndOfFile()) {
+      counter500Ms--;
+    }
+    clock++;
+  }
+}
+
+EncodeDecodeTest::EncodeDecodeTest() {
+  _testMode = 2;
+  Trace::CreateTrace();
+  Trace::SetTraceFile("acm_encdec_test.txt");
+}
+
+EncodeDecodeTest::EncodeDecodeTest(int testMode) {
+  //testMode == 0 for autotest
+  //testMode == 1 for testing all codecs/parameters
+  //testMode > 1 for specific user-input test (as it was used before)
+ _testMode = testMode;
+ if(_testMode != 0) {
+   Trace::CreateTrace();
+   Trace::SetTraceFile("acm_encdec_test.txt");
+ }
+}
+
+void EncodeDecodeTest::Perform() {
+  if (_testMode == 0) {
+    printf("Running Encode/Decode Test");
+    WEBRTC_TRACE(webrtc::kTraceStateInfo, webrtc::kTraceAudioCoding, -1,
+                 "---------- EncodeDecodeTest ----------");
+  }
+
+  int numCodecs = 1;
+  int codePars[3]; //freq, pacsize, rate
+  int playoutFreq[3]; //8, 16, 32k
+  int numPars[52]; //number of codec parameters sets (rate,freq,pacsize)to test,
+                   //for a given codec
+
+  codePars[0] = 0;
+  codePars[1] = 0;
+  codePars[2] = 0;
+
+  if (_testMode == 1) {
+    AudioCodingModule *acmTmp = AudioCodingModule::Create(0);
+    struct CodecInst sendCodecTmp;
+    numCodecs = acmTmp->NumberOfCodecs();
+    printf("List of supported codec.\n");
+    for(int n = 0; n < numCodecs; n++) {
+      acmTmp->Codec(n, sendCodecTmp);
+      if (STR_CASE_CMP(sendCodecTmp.plname, "telephone-event") == 0) {
+        numPars[n] = 0;
+      } else if (STR_CASE_CMP(sendCodecTmp.plname, "cn") == 0) {
+        numPars[n] = 0;
+      } else if (STR_CASE_CMP(sendCodecTmp.plname, "red") == 0) {
+        numPars[n] = 0;
+      } else {
+        numPars[n] = 1;
+        printf("%d %s\n", n, sendCodecTmp.plname);
+      }
+    }
+    AudioCodingModule::Destroy(acmTmp);
+    playoutFreq[1] = 16000;
+  } else if (_testMode == 0) {
+    AudioCodingModule *acmTmp = AudioCodingModule::Create(0);
+    numCodecs = acmTmp->NumberOfCodecs();
+    AudioCodingModule::Destroy(acmTmp);
+    struct CodecInst dummyCodec;
+
+    //chose range of testing for codecs/parameters
+    for(int i = 0 ; i < numCodecs ; i++) {
+      numPars[i] = 1;
+      acmTmp->Codec(i, dummyCodec);
+      if (STR_CASE_CMP(dummyCodec.plname, "telephone-event") == 0) {
+        numPars[i] = 0;
+      } else if (STR_CASE_CMP(dummyCodec.plname, "cn") == 0) {
+        numPars[i] = 0;
+      } else if (STR_CASE_CMP(dummyCodec.plname, "red") == 0) {
+        numPars[i] = 0;
+      }
+    }
+    playoutFreq[1] = 16000;
+  } else {
+    numCodecs = 1;
+    numPars[0] = 1;
+    playoutFreq[1]=16000;
+  }
+
+  _receiver.testMode = _testMode;
+
+  //loop over all codecs:
+  for (int codeId = 0; codeId < numCodecs; codeId++) {
+    //only encode using real encoders, not telephone-event anc cn
+    for (int loopPars = 1; loopPars <= numPars[codeId]; loopPars++) {
+      if (_testMode == 1) {
+        printf("\n");
+        printf("***FOR RUN: codeId: %d\n", codeId);
+        printf("\n");
+      } else if (_testMode == 0) {
+        printf(".");
+      }
+
+      EncodeToFile(1, codeId, codePars, _testMode);
+
+      AudioCodingModule *acm = AudioCodingModule::Create(10);
+      RTPFile rtpFile;
+      char fileName[] = "outFile.rtp";
+      rtpFile.Open(fileName, "rb");
+
+      _receiver.codeId = codeId;
+
+      rtpFile.ReadHeader();
+      _receiver.Setup(acm, &rtpFile);
+      _receiver.Run();
+      _receiver.Teardown();
+      rtpFile.Close();
+      AudioCodingModule::Destroy(acm);
+
+      if (_testMode == 1) {
+        printf("***COMPLETED RUN FOR: codecID: %d ***\n", codeId);
+      }
+    }
+  }
+  if (_testMode == 0) {
+    printf("Done!\n");
+  }
+  if (_testMode == 1)
+    Trace::ReturnTrace();
+}
+
+void EncodeDecodeTest::EncodeToFile(int fileType, int codeId, int* codePars,
+                                    int testMode) {
+  AudioCodingModule *acm = AudioCodingModule::Create(0);
+  RTPFile rtpFile;
+  char fileName[] = "outFile.rtp";
+  rtpFile.Open(fileName, "wb+");
+  rtpFile.WriteHeader();
+
+  //for auto_test and logging
+  _sender.testMode = testMode;
+  _sender.codeId = codeId;
+
+  _sender.Setup(acm, &rtpFile);
+  struct CodecInst sendCodecInst;
+  if (acm->SendCodec(sendCodecInst) >= 0) {
+    _sender.Run();
+  }
+  _sender.Teardown();
+  rtpFile.Close();
+  AudioCodingModule::Destroy(acm);
+}
+
+} // namespace webrtc