git-svn-id: http://webrtc.googlecode.com/svn/trunk@4 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/modules/utility/test/testAPI.cpp b/modules/utility/test/testAPI.cpp
new file mode 100644
index 0000000..96664a3
--- /dev/null
+++ b/modules/utility/test/testAPI.cpp
@@ -0,0 +1,368 @@
+/*
+ *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+// testAPI.cpp : Defines the entry point for the console application.
+//
+// NOTES:
+//          1. MediaFile library and testAPI.cpp must be built in DEBUG mode for testing.
+//
+
+#include <iostream>
+#include <stdio.h>
+#include <assert.h>
+
+#ifdef WIN32
+    #include <windows.h>
+    #include <tchar.h>
+#endif
+
+#include "common_types.h"
+#include "trace.h"
+
+#include "Engineconfigurations.h"
+#include "media_file.h"
+#include "file_player.h"
+#include "file_recorder.h"
+
+
+bool notify = false, playing = false, recording = false;
+
+// callback class for FileModule
+class MyFileModuleCallback : public FileCallback
+{
+public:
+    virtual void PlayNotification( const WebRtc_Word32 id,
+                                   const WebRtc_UWord32 durationMs )
+    {
+        printf("\tReceived PlayNotification from module %ld, durationMs = %ld\n",
+               id, durationMs);
+        notify = true;
+    };
+
+    virtual void RecordNotification( const WebRtc_Word32 id,
+                                     const WebRtc_UWord32 durationMs )
+    {
+        printf("\tReceived RecordNotification from module %ld, durationMs = %ld\n",
+               id, durationMs);
+        notify = true;
+    };
+
+    virtual void PlayFileEnded(const WebRtc_Word32 id)
+    {
+        printf("\tReceived PlayFileEnded notification from module %ld.\n", id);
+        playing = false;
+    };
+
+    virtual void RecordFileEnded(const WebRtc_Word32 id)
+    {
+        printf("\tReceived RecordFileEnded notification from module %ld.\n", id);
+        recording = false;
+    }
+};
+
+// main test app
+#ifdef WIN32
+int _tmain(int argc, _TCHAR* argv[])
+#else
+int main(int /*argc*/, char** /*argv*/)
+#endif
+{
+    Trace::CreateTrace();
+    Trace::SetTraceFile("testTrace.txt");
+    Trace::SetEncryptedTraceFile("testTraceDebug.txt");
+
+    int playId = 1;
+    int recordId = 2;
+
+    printf("Welcome to test of FilePlayer and FileRecorder\n");
+
+
+    ///////////////////////////////////////////////
+    //
+    // avi test case 1
+    //
+    ///////////////////////////////////////////////
+
+
+    // todo PW we need more AVI tests Mp4
+
+    {
+        FilePlayer& filePlayer(*FilePlayer::CreateFilePlayer(1, webrtc::kFileFormatAviFile));
+        FileRecorder& fileRecorder(*FileRecorder::CreateFileRecorder(1, webrtc::kFileFormatAviFile));
+
+        const char* KFileName = "./tmpAviFileTestCase1_audioI420CIF30fps.avi";
+
+        printf("\tReading from an avi file and writing the information to another \n");
+        printf("\tin the same format (I420 CIF 30fps) \n");
+        printf("\t\t check file named %s\n", KFileName);
+
+        assert(filePlayer.StartPlayingVideoFile(
+           "../../../MediaFile/main/test/files/aviTestCase1_audioI420CIF30fps.avi",
+           false, false) == 0);
+
+        // init codecs
+         webrtc::VideoCodec videoCodec;
+        webrtc::VideoCodec recVideoCodec;
+        webrtc::CodecInst audioCodec;
+        assert(filePlayer.VideoCodec( videoCodec ) == 0);
+        assert(filePlayer.AudioCodec( audioCodec) == 0);
+
+        recVideoCodec = videoCodec;
+
+        assert( fileRecorder.StartRecordingVideoFile(KFileName,
+                                                     audioCodec,
+                                                     recVideoCodec) == 0);
+
+        assert(fileRecorder.IsRecording());
+
+        WebRtc_UWord32 videoReadSize = static_cast<WebRtc_UWord32>( (videoCodec.width * videoCodec.height * 3.0) / 2.0);
+
+        webrtc::VideoFrame videoFrame;
+        videoFrame.VerifyAndAllocate(videoReadSize);
+
+        int  frameCount   = 0;
+        bool audioNotDone = true;
+        bool videoNotDone =    true;
+        AudioFrame audioFrame;
+
+        while( audioNotDone || videoNotDone)
+        {
+            if(filePlayer.TimeUntilNextVideoFrame() <= 0)
+            {
+                if(filePlayer.GetVideoFromFile( videoFrame) != 0)
+                {
+                    // no more video frames
+                    break;
+                }
+                frameCount++;
+                videoNotDone = ( videoFrame.Length() > 0);
+                videoFrame.SetRenderTime(TickTime::MillisecondTimestamp());
+                if( videoNotDone)
+                {
+                    assert(fileRecorder.RecordVideoToFile(videoFrame) == 0);
+                    ::Sleep(10);
+                }
+            }
+             WebRtc_UWord32 decodedDataLengthInSamples;
+            if( 0 !=  filePlayer.Get10msAudioFromFile( audioFrame._payloadData, decodedDataLengthInSamples, audioCodec.plfreq))
+            {
+                audioNotDone = false;
+            } else
+            {
+                audioFrame._frequencyInHz = filePlayer.Frequency();
+                audioFrame._payloadDataLengthInSamples = (WebRtc_UWord16)decodedDataLengthInSamples;
+                fileRecorder.RecordAudioToFile(audioFrame, &TickTime::Now());
+            }
+       }
+        ::Sleep(100);
+        assert(fileRecorder.StopRecording() == 0);
+        assert( !fileRecorder.IsRecording());
+        assert(frameCount == 135);
+        printf("\tGenerated %s\n\n", KFileName);
+    }
+    ///////////////////////////////////////////////
+    //
+    // avi test case 2
+    //
+    ///////////////////////////////////////////////
+    {
+        FilePlayer& filePlayer(*FilePlayer::CreateFilePlayer(2, webrtc::kFileFormatAviFile));
+        FileRecorder& fileRecorder(*FileRecorder::CreateFileRecorder(2, webrtc::kFileFormatAviFile));
+
+        const char* KFileName = "./tmpAviFileTestCase2_audioI420CIF20fps.avi";
+
+        printf("\tWriting information to a avi file and check the written file by \n");
+        printf("\treopening it and control codec information.\n");
+        printf("\t\t check file named %s all frames should be light green.\n", KFileName);
+        // init codecs
+        webrtc::VideoCodec videoCodec;
+        webrtc::CodecInst      audioCodec;
+
+        memset(&videoCodec, 0, sizeof(videoCodec));
+
+        const char* KVideoCodecName = "I420";
+        strcpy(videoCodec.plName, KVideoCodecName);
+        videoCodec.plType    = 124;
+        videoCodec.maxFramerate = 20;
+        videoCodec.height    = 288;
+        videoCodec.width     = 352;
+
+        const char* KAudioCodecName = "PCMU";
+        strcpy(audioCodec.plname, KAudioCodecName);
+        audioCodec.pltype   = 0;
+        audioCodec.plfreq   = 8000;
+        audioCodec.pacsize  = 80;
+        audioCodec.channels = 1;
+        audioCodec.rate     = 64000;
+
+        assert( fileRecorder.StartRecordingVideoFile(
+            KFileName,
+            audioCodec,
+            videoCodec) == 0);
+
+        assert(fileRecorder.IsRecording());
+
+        const WebRtc_UWord32 KVideoWriteSize = static_cast< WebRtc_UWord32>( (videoCodec.width * videoCodec.height * 3) / 2);
+        webrtc::VideoFrame videoFrame;
+
+        // 10 ms
+        AudioFrame audioFrame;
+        audioFrame._payloadDataLengthInSamples = audioCodec.plfreq/100;
+        memset(audioFrame._payloadData, 0, 2*audioFrame._payloadDataLengthInSamples);
+        audioFrame._frequencyInHz = 8000;
+
+        // prepare the video frame
+        videoFrame.VerifyAndAllocate(KVideoWriteSize);
+        memset(videoFrame.Buffer(), 127, videoCodec.width * videoCodec.height);
+        memset(videoFrame.Buffer() +(videoCodec.width * videoCodec.height), 0, videoCodec.width * videoCodec.height/2);
+        videoFrame.SetLength(KVideoWriteSize);
+        videoFrame.SetHeight(videoCodec.height);
+        videoFrame.SetWidth(videoCodec.width);
+
+        // write avi file, with 20 video frames
+        const int KWriteNumFrames = 20;
+        int       writeFrameCount = 0;
+        while(writeFrameCount < KWriteNumFrames)
+        {
+            // add a video frame
+            assert(fileRecorder.RecordVideoToFile(videoFrame) == 0);
+
+            // add 50 ms of audio
+            for(int i=0; i<5; i++)
+            {
+                assert( fileRecorder.RecordAudioToFile(audioFrame) == 0);
+            }// for i
+            writeFrameCount++;
+        }
+        ::Sleep(10); // enough tim eto write the queued data to the file
+        assert(writeFrameCount == 20);
+        assert(fileRecorder.StopRecording() == 0);
+        assert( ! fileRecorder.IsRecording());
+
+        assert(filePlayer.StartPlayingVideoFile(KFileName,false, false) == 0);
+        assert(filePlayer.IsPlayingFile( ));
+
+        // compare codecs read from file to the ones used when writing the file
+        webrtc::VideoCodec readVideoCodec;
+        assert(filePlayer.VideoCodec( readVideoCodec ) == 0);
+        assert(strcmp(readVideoCodec.plName, videoCodec.plName) == 0);
+        assert(readVideoCodec.width      == videoCodec.width);
+        assert(readVideoCodec.height     == videoCodec.height);
+        assert(readVideoCodec.maxFramerate  == videoCodec.maxFramerate);
+
+        webrtc::CodecInst readAudioCodec;
+        assert(filePlayer.AudioCodec( readAudioCodec) == 0);
+        assert(strcmp(readAudioCodec.plname, audioCodec.plname) == 0);
+        assert(readAudioCodec.pltype     == audioCodec.pltype);
+        assert(readAudioCodec.plfreq     == audioCodec.plfreq);
+        assert(readAudioCodec.pacsize    == audioCodec.pacsize);
+        assert(readAudioCodec.channels   == audioCodec.channels);
+        assert(readAudioCodec.rate       == audioCodec.rate);
+
+        assert(filePlayer.StopPlayingFile() == 0);
+        assert( ! filePlayer.IsPlayingFile());
+        printf("\tGenerated %s\n\n", KFileName);
+    }
+    ///////////////////////////////////////////////
+    //
+    // avi test case 3
+    //
+    ///////////////////////////////////////////////
+
+    {
+        FilePlayer& filePlayer(*FilePlayer::CreateFilePlayer(2, webrtc::kFileFormatAviFile));
+        FileRecorder& fileRecorder(*FileRecorder::CreateFileRecorder(3, webrtc::kFileFormatAviFile));
+
+        printf("\tReading from an avi file and writing the information to another \n");
+        printf("\tin a different format (H.263 CIF 30fps) \n");
+        printf("\t\t check file named tmpAviFileTestCase1_audioH263CIF30fps.avi\n");
+
+        assert(filePlayer.StartPlayingVideoFile(
+           "../../../MediaFile/main/test/files/aviTestCase1_audioI420CIF30fps.avi",
+           false,
+           false) == 0);
+
+        // init codecs
+         webrtc::VideoCodec videoCodec;
+        webrtc::VideoCodec recVideoCodec;
+        webrtc::CodecInst      audioCodec;
+        assert(filePlayer.VideoCodec( videoCodec ) == 0);
+        assert(filePlayer.AudioCodec( audioCodec) == 0);
+        recVideoCodec = videoCodec;
+
+        memcpy(recVideoCodec.plName, "H263",5);
+        recVideoCodec.startBitrate = 1000;
+        recVideoCodec.codecSpecific.H263.quality = 1;
+        recVideoCodec.plType = 34;
+        recVideoCodec.codecType = webrtc::kVideoCodecH263;
+
+        assert( fileRecorder.StartRecordingVideoFile(
+            "./tmpAviFileTestCase1_audioH263CIF30fps.avi",
+            audioCodec,
+            recVideoCodec) == 0);
+
+        assert(fileRecorder.IsRecording());
+
+        WebRtc_UWord32 videoReadSize = static_cast<WebRtc_UWord32>( (videoCodec.width * videoCodec.height * 3.0) / 2.0);
+
+        webrtc::VideoFrame videoFrame;
+        videoFrame.VerifyAndAllocate(videoReadSize);
+
+        int  videoFrameCount   = 0;
+        int  audioFrameCount   = 0;
+        bool audioNotDone = true;
+        bool videoNotDone =    true;
+        AudioFrame audioFrame;
+
+        while( audioNotDone || videoNotDone)
+        {
+            if(filePlayer.TimeUntilNextVideoFrame() <= 0)
+            {
+                if(filePlayer.GetVideoFromFile( videoFrame) != 0)
+                {
+                    break;
+                }
+                videoFrameCount++;
+                videoNotDone = ( videoFrame.Length() > 0);
+                if( videoNotDone)
+                {
+                    assert(fileRecorder.RecordVideoToFile(videoFrame) == 0);
+                }
+            }
+
+            WebRtc_UWord32 decodedDataLengthInSamples;
+            if( 0 != filePlayer.Get10msAudioFromFile( audioFrame._payloadData, decodedDataLengthInSamples, audioCodec.plfreq))
+            {
+                audioNotDone = false;
+
+            } else
+            {
+                ::Sleep(5);
+                audioFrame._frequencyInHz = filePlayer.Frequency();
+                audioFrame._payloadDataLengthInSamples = (WebRtc_UWord16)decodedDataLengthInSamples;
+                assert(0 == fileRecorder.RecordAudioToFile(audioFrame));
+
+                audioFrameCount++;
+            }
+        }
+        assert(videoFrameCount == 135);
+        assert(audioFrameCount == 446); // we will start & stop with a video frame
+
+        assert(fileRecorder.StopRecording() == 0);
+        assert( !fileRecorder.IsRecording());
+        printf("\tGenerated ./tmpAviFileTestCase1_audioH263CIF30fps.avi\n\n");
+    }
+
+
+    printf("\nTEST completed.\n");
+
+    Trace::ReturnTrace();
+    return 0;
+}