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;
+}