git-svn-id: http://webrtc.googlecode.com/svn/trunk@4 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
		
							
								
								
									
										368
									
								
								modules/utility/test/testAPI.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										368
									
								
								modules/utility/test/testAPI.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 niklase@google.com
					niklase@google.com