Re #1182:
 - Renamed vstreamutil.c to vid_steamutil.c just for filename format consistency reason.
 - Updated sample app simpleua.c and vid_streamutil.c to sync with updated API, e.g: strip session usage, two media ports exported video streams for each dir.
 - Added vid_streamutil.c capability to be able to stream video file (involving transcoding when video codec used in the file different to the video stream codec), also updated AVI player and ffmpeg codecs to be able to read and decode XVID/MPEG4 codec.
 - Fixed bug wrong media type check in stream.c and vid_stream.c in creating stream info from SDP.
 - Minor update: docs, logs, app samples makefiles.



git-svn-id: https://svn.pjsip.org/repos/pjproject/branches/projects/2.0-dev@3425 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip-apps/build/Samples-vc.mak b/pjsip-apps/build/Samples-vc.mak
index 3e4cffa..b3a76e6 100644
--- a/pjsip-apps/build/Samples-vc.mak
+++ b/pjsip-apps/build/Samples-vc.mak
@@ -88,7 +88,7 @@
 	  $(BINDIR)\streamutil.exe \
 	  $(BINDIR)\strerror.exe \
 	  $(BINDIR)\tonegen.exe \
-	  $(BINDIR)\vstreamutil.exe
+	  $(BINDIR)\vid_streamutil.exe
 
 
 all: $(BINDIR) $(OBJDIR) $(SAMPLES)
diff --git a/pjsip-apps/build/Samples.mak b/pjsip-apps/build/Samples.mak
index c5ee5e7..0f036ac 100644
--- a/pjsip-apps/build/Samples.mak
+++ b/pjsip-apps/build/Samples.mak
@@ -40,7 +40,7 @@
 	   streamutil \
 	   strerror \
 	   tonegen \
-	   vstreamutil
+	   vid_streamutil
 
 EXES := $(foreach file, $(SAMPLES), $(BINDIR)/$(file)$(HOST_EXE))
 
diff --git a/pjsip-apps/build/samples.vcproj b/pjsip-apps/build/samples.vcproj
index 0ba5097..f7825e0 100644
--- a/pjsip-apps/build/samples.vcproj
+++ b/pjsip-apps/build/samples.vcproj
@@ -136,516 +136,6 @@
 			/>

 		</Configuration>

 		<Configuration

-			Name="Debug|Win32"

-			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-		</Configuration>

-		<Configuration

-			Name="Debug|Pocket PC 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

-			Name="Debug|Smartphone 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

-			Name="Debug-Static|Win32"

-			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-		</Configuration>

-		<Configuration

-			Name="Debug-Static|Pocket PC 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

-			Name="Debug-Static|Smartphone 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

-			Name="Release-Dynamic|Win32"

-			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-		</Configuration>

-		<Configuration

-			Name="Release-Dynamic|Pocket PC 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

-			Name="Release-Dynamic|Smartphone 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

-			Name="Debug-Dynamic|Win32"

-			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-		</Configuration>

-		<Configuration

-			Name="Debug-Dynamic|Pocket PC 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

-			Name="Debug-Dynamic|Smartphone 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

-			Name="Release-Static|Win32"

-			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-		</Configuration>

-		<Configuration

-			Name="Release-Static|Pocket PC 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

-			Name="Release-Static|Smartphone 2003 (ARMV4)"

-			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

-			IntermediateDirectory="$(OutDir)"

-			ConfigurationType="0"

-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

-			UseOfMFC="0"

-			ATLMinimizesCRunTimeLibraryUsage="false"

-			BuildLogFile=""

-			>

-			<Tool

-				Name="VCNMakeTool"

-				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8"

-				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 /a"

-				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 clean"

-				Output="All samples"

-				PreprocessorDefinitions=""

-				IncludeSearchPath=""

-				ForcedIncludes=""

-				AssemblySearchPath=""

-				ForcedUsingAssemblies=""

-				CompileAsManaged=""

-			/>

-			<Tool

-				Name="VCCLCompilerTool"

-				ExecutionBucket="7"

-			/>

-			<Tool

-				Name="VCCodeSignTool"

-			/>

-			<DeploymentTool

-				ForceDirty="-1"

-				RemoteDirectory=""

-				RegisterOutput="0"

-				AdditionalFiles=""

-			/>

-			<DebuggerTool

-			/>

-		</Configuration>

-		<Configuration

 			Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

 			OutputDirectory=".\output\$(ProjectName)-wm6std-$(PlatformName)-vs8-$(ConfigurationName)"

 			IntermediateDirectory="$(OutDir)"

@@ -802,6 +292,108 @@
 			/>

 		</Configuration>

 		<Configuration

+			Name="Debug|Win32"

+			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+		</Configuration>

+		<Configuration

+			Name="Debug|Pocket PC 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

+			Name="Debug|Smartphone 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

 			Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

 			OutputDirectory=".\output\$(ProjectName)-wm6std-$(PlatformName)-vs8-$(ConfigurationName)"

 			IntermediateDirectory="$(OutDir)"

@@ -958,6 +550,108 @@
 			/>

 		</Configuration>

 		<Configuration

+			Name="Debug-Static|Win32"

+			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+		</Configuration>

+		<Configuration

+			Name="Debug-Static|Pocket PC 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

+			Name="Debug-Static|Smartphone 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-static VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

 			Name="Debug-Static|Windows Mobile 6 Standard SDK (ARMV4I)"

 			OutputDirectory=".\output\$(ProjectName)-wm6std-$(PlatformName)-vs8-$(ConfigurationName)"

 			IntermediateDirectory="$(OutDir)"

@@ -1114,6 +808,108 @@
 			/>

 		</Configuration>

 		<Configuration

+			Name="Release-Dynamic|Win32"

+			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+		</Configuration>

+		<Configuration

+			Name="Release-Dynamic|Pocket PC 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

+			Name="Release-Dynamic|Smartphone 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-dynamic VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

 			Name="Release-Dynamic|Windows Mobile 6 Standard SDK (ARMV4I)"

 			OutputDirectory=".\output\$(ProjectName)-wm6std-$(PlatformName)-vs8-$(ConfigurationName)"

 			IntermediateDirectory="$(OutDir)"

@@ -1270,6 +1066,108 @@
 			/>

 		</Configuration>

 		<Configuration

+			Name="Debug-Dynamic|Win32"

+			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+		</Configuration>

+		<Configuration

+			Name="Debug-Dynamic|Pocket PC 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

+			Name="Debug-Dynamic|Smartphone 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=debug-dynamic VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

 			Name="Debug-Dynamic|Windows Mobile 6 Standard SDK (ARMV4I)"

 			OutputDirectory=".\output\$(ProjectName)-wm6std-$(PlatformName)-vs8-$(ConfigurationName)"

 			IntermediateDirectory="$(OutDir)"

@@ -1426,6 +1324,108 @@
 			/>

 		</Configuration>

 		<Configuration

+			Name="Release-Static|Win32"

+			OutputDirectory=".\output\$(ProjectName)-i386-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+		</Configuration>

+		<Configuration

+			Name="Release-Static|Pocket PC 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003ppc-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

+			Name="Release-Static|Smartphone 2003 (ARMV4)"

+			OutputDirectory=".\output\$(ProjectName)-wm2003sp-$(PlatformName)-vs8-$(ConfigurationName)"

+			IntermediateDirectory="$(OutDir)"

+			ConfigurationType="0"

+			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC60.vsprops"

+			UseOfMFC="0"

+			ATLMinimizesCRunTimeLibraryUsage="false"

+			BuildLogFile=""

+			>

+			<Tool

+				Name="VCNMakeTool"

+				BuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8"

+				ReBuildCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 /a"

+				CleanCommandLine="nmake /NOLOGO /S /f Samples-vc.mak BUILD_MODE=release-static VC_VER=8 clean"

+				Output="All samples"

+				PreprocessorDefinitions=""

+				IncludeSearchPath=""

+				ForcedIncludes=""

+				AssemblySearchPath=""

+				ForcedUsingAssemblies=""

+				CompileAsManaged=""

+			/>

+			<Tool

+				Name="VCCLCompilerTool"

+				ExecutionBucket="7"

+			/>

+			<Tool

+				Name="VCCodeSignTool"

+			/>

+			<DeploymentTool

+				ForceDirty="-1"

+				RemoteDirectory=""

+				RegisterOutput="0"

+				AdditionalFiles=""

+			/>

+			<DebuggerTool

+			/>

+		</Configuration>

+		<Configuration

 			Name="Release-Static|Windows Mobile 6 Standard SDK (ARMV4I)"

 			OutputDirectory=".\output\$(ProjectName)-wm6std-$(PlatformName)-vs8-$(ConfigurationName)"

 			IntermediateDirectory="$(OutDir)"

@@ -1714,7 +1714,7 @@
 				>

 			</File>

 			<File

-				RelativePath="..\src\samples\vstreamutil.c"

+				RelativePath="..\src\samples\vid_streamutil.c"

 				>

 			</File>

 		</Filter>

diff --git a/pjsip-apps/src/samples/aviplay.c b/pjsip-apps/src/samples/aviplay.c
index 6a806cb..9583fb4 100644
--- a/pjsip-apps/src/samples/aviplay.c
+++ b/pjsip-apps/src/samples/aviplay.c
@@ -85,6 +85,7 @@
                    PJ_TRUE , PJMEDIA_FORMAT_I420},
                   {PJMEDIA_FORMAT_H263 , "h263" ,
                    PJ_FALSE, 0},
+		  {PJMEDIA_FORMAT_XVID , "xvid"},
                  };
 
 typedef struct avi_port_t
@@ -105,7 +106,7 @@
     pjmedia_converter   *conv;
 } codec_port_data_t;
 
-static pj_status_t avi_event_cb(pjmedia_vid_stream *stream,
+static pj_status_t avi_event_cb(pjmedia_vid_dev_stream *stream,
 				void *user_data,
 				pjmedia_vid_event *event)
 {
diff --git a/pjsip-apps/src/samples/simpleua.c b/pjsip-apps/src/samples/simpleua.c
index 181d427..9839d16 100644
--- a/pjsip-apps/src/samples/simpleua.c
+++ b/pjsip-apps/src/samples/simpleua.c
@@ -67,11 +67,19 @@
 
 
 /* Settings */
-#define AF	    pj_AF_INET()     /* Change to pj_AF_INET6() for IPv6.
+#define AF		pj_AF_INET() /* Change to pj_AF_INET6() for IPv6.
 				      * PJ_HAS_IPV6 must be enabled and
 				      * your system must support IPv6.  */
-#define SIP_PORT    5060	     /* Listening SIP port		*/
-#define RTP_PORT    4000	     /* RTP port			*/
+#if 0
+#define SIP_PORT	5080	     /* Listening SIP port		*/
+#define RTP_PORT	5000	     /* RTP port			*/
+#else
+#define SIP_PORT	5060	     /* Listening SIP port		*/
+#define RTP_PORT	4000	     /* RTP port			*/
+#endif
+
+#define MAX_MEDIA_CNT	2	     /* Media count, set to 1 for audio
+				      * only or 2 for audio and video	*/
 
 /*
  * Static variables.
@@ -82,14 +90,22 @@
 static pj_caching_pool	     cp;	    /* Global pool factory.	*/
 
 static pjmedia_endpt	    *g_med_endpt;   /* Media endpoint.		*/
-static pjmedia_transport_info g_med_tpinfo; /* Socket info for media	*/
-static pjmedia_transport    *g_med_transport;/* Media stream transport	*/
+
+static pjmedia_transport_info g_med_tpinfo[MAX_MEDIA_CNT]; 
+					    /* Socket info for media	*/
+static pjmedia_transport    *g_med_transport[MAX_MEDIA_CNT];
+					    /* Media stream transport	*/
+static pjmedia_sock_info     g_sock_info[MAX_MEDIA_CNT];  
+					    /* Socket info array	*/
 
 /* Call variables: */
 static pjsip_inv_session    *g_inv;	    /* Current invite session.	*/
-static pjmedia_session	    *g_med_session; /* Call's media session.	*/
+static pjmedia_stream       *g_med_stream;  /* Call's audio stream.	*/
+static pjmedia_vid_stream   *g_med_vstream; /* Call's video stream.	*/
 static pjmedia_snd_port	    *g_snd_player;  /* Call's sound player	*/
 static pjmedia_snd_port	    *g_snd_rec;	    /* Call's sound recorder.	*/
+static pjmedia_vid_port	    *g_vid_capturer;/* Call's video capturer.	*/
+static pjmedia_vid_port	    *g_vid_renderer;/* Call's video renderer.	*/
 
 
 /*
@@ -136,6 +152,68 @@
 };
 
 
+/* Notification on incoming messages */
+static pj_bool_t logging_on_rx_msg(pjsip_rx_data *rdata)
+{
+    PJ_LOG(4,(THIS_FILE, "RX %d bytes %s from %s %s:%d:\n"
+			 "%.*s\n"
+			 "--end msg--",
+			 rdata->msg_info.len,
+			 pjsip_rx_data_get_info(rdata),
+			 rdata->tp_info.transport->type_name,
+			 rdata->pkt_info.src_name,
+			 rdata->pkt_info.src_port,
+			 (int)rdata->msg_info.len,
+			 rdata->msg_info.msg_buf));
+    
+    /* Always return false, otherwise messages will not get processed! */
+    return PJ_FALSE;
+}
+
+/* Notification on outgoing messages */
+static pj_status_t logging_on_tx_msg(pjsip_tx_data *tdata)
+{
+    
+    /* Important note:
+     *	tp_info field is only valid after outgoing messages has passed
+     *	transport layer. So don't try to access tp_info when the module
+     *	has lower priority than transport layer.
+     */
+
+    PJ_LOG(4,(THIS_FILE, "TX %d bytes %s to %s %s:%d:\n"
+			 "%.*s\n"
+			 "--end msg--",
+			 (tdata->buf.cur - tdata->buf.start),
+			 pjsip_tx_data_get_info(tdata),
+			 tdata->tp_info.transport->type_name,
+			 tdata->tp_info.dst_name,
+			 tdata->tp_info.dst_port,
+			 (int)(tdata->buf.cur - tdata->buf.start),
+			 tdata->buf.start));
+
+    /* Always return success, otherwise message will not get sent! */
+    return PJ_SUCCESS;
+}
+
+/* The module instance. */
+static pjsip_module msg_logger = 
+{
+    NULL, NULL,				/* prev, next.		*/
+    { "mod-msg-log", 13 },		/* Name.		*/
+    -1,					/* Id			*/
+    PJSIP_MOD_PRIORITY_TRANSPORT_LAYER-1,/* Priority	        */
+    NULL,				/* load()		*/
+    NULL,				/* start()		*/
+    NULL,				/* stop()		*/
+    NULL,				/* unload()		*/
+    &logging_on_rx_msg,			/* on_rx_request()	*/
+    &logging_on_rx_msg,			/* on_rx_response()	*/
+    &logging_on_tx_msg,			/* on_tx_request.	*/
+    &logging_on_tx_msg,			/* on_tx_response()	*/
+    NULL,				/* on_tsx_state()	*/
+
+};
+
 
 /*
  * main()
@@ -145,12 +223,15 @@
  */
 int main(int argc, char *argv[])
 {
+    pj_pool_t *pool;
     pj_status_t status;
+    unsigned i;
 
     /* Must init PJLIB first: */
     status = pj_init();
     PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
 
+    pj_log_set_level(5);
 
     /* Then init PJLIB-UTIL: */
     status = pjlib_util_init();
@@ -262,6 +343,12 @@
     status = pjsip_endpt_register_module( g_endpt, &mod_simpleua);
     PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
 
+    /*
+     * Register message logger module.
+     */
+    status = pjsip_endpt_register_module( g_endpt, &msg_logger);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
 
     /* 
      * Initialize media endpoint.
@@ -284,28 +371,49 @@
     PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
 #endif
 
+
+    /* Init video subsystem */
+    pool = pjmedia_endpt_create_pool(g_med_endpt, "Video subsystem", 512, 512);
+    status = pjmedia_video_format_mgr_create(pool, 64, 0, NULL);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+    status = pjmedia_converter_mgr_create(pool, NULL);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+    status = pjmedia_vid_codec_mgr_create(pool, NULL);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+    status = pjmedia_vid_subsys_init(&cp.factory);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
+    /* Init ffmpeg video codecs */
+    status = pjmedia_codec_ffmpeg_init(NULL, &cp.factory);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
     
     /* 
      * Create media transport used to send/receive RTP/RTCP socket.
      * One media transport is needed for each call. Application may
      * opt to re-use the same media transport for subsequent calls.
      */
-    status = pjmedia_transport_udp_create3(g_med_endpt, AF, NULL, NULL, 
-				           RTP_PORT, 0, &g_med_transport);
-    if (status != PJ_SUCCESS) {
-	app_perror(THIS_FILE, "Unable to create media transport", status);
-	return 1;
+    for (i = 0; i < PJ_ARRAY_SIZE(g_med_transport); ++i) {
+	status = pjmedia_transport_udp_create3(g_med_endpt, AF, NULL, NULL, 
+					       RTP_PORT + i*2, 0, 
+					       &g_med_transport[i]);
+	if (status != PJ_SUCCESS) {
+	    app_perror(THIS_FILE, "Unable to create media transport", status);
+	    return 1;
+	}
+
+	/* 
+	 * Get socket info (address, port) of the media transport. We will
+	 * need this info to create SDP (i.e. the address and port info in
+	 * the SDP).
+	 */
+	pjmedia_transport_info_init(&g_med_tpinfo[i]);
+	pjmedia_transport_get_info(g_med_transport[i], &g_med_tpinfo[i]);
+
+	pj_memcpy(&g_sock_info[i], &g_med_tpinfo[i].sock_info,
+		  sizeof(pjmedia_sock_info));
     }
 
-    /* 
-     * Get socket info (address, port) of the media transport. We will
-     * need this info to create SDP (i.e. the address and port info in
-     * the SDP).
-     */
-    pjmedia_transport_info_init(&g_med_tpinfo);
-    pjmedia_transport_get_info(g_med_transport, &g_med_tpinfo);
-
-
     /*
      * If URL is specified, then make call immediately.
      */
@@ -366,9 +474,8 @@
 	 */
 	status = pjmedia_endpt_create_sdp( g_med_endpt,	    /* the media endpt	*/
 					   dlg->pool,	    /* pool.		*/
-					   1,		    /* # of streams	*/
-					   &g_med_tpinfo.sock_info,   
-							    /* RTP sock info	*/
+					   MAX_MEDIA_CNT,	    /* # of streams	*/
+					   g_sock_info,     /* RTP sock info	*/
 					   &local_sdp);	    /* the SDP result	*/
 	PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
 
@@ -440,6 +547,8 @@
     /* On exit, dump current memory usage: */
     dump_pool_usage(THIS_FILE, &cp);
 
+    pj_pool_release(pool);
+
     return 0;
 }
 
@@ -574,9 +683,8 @@
      * Get media capability from media endpoint: 
      */
 
-    status = pjmedia_endpt_create_sdp( g_med_endpt, rdata->tp_info.pool, 1,
-				       &g_med_tpinfo.sock_info, 
-				       &local_sdp);
+    status = pjmedia_endpt_create_sdp( g_med_endpt, rdata->tp_info.pool,
+				       MAX_MEDIA_CNT, g_sock_info, &local_sdp);
     PJ_ASSERT_RETURN(status == PJ_SUCCESS, PJ_TRUE);
 
 
@@ -639,7 +747,7 @@
 static void call_on_media_update( pjsip_inv_session *inv,
 				  pj_status_t status)
 {
-    pjmedia_session_info sess_info;
+    pjmedia_stream_info stream_info;
     const pjmedia_sdp_session *local_sdp;
     const pjmedia_sdp_session *remote_sdp;
     pjmedia_port *media_port;
@@ -662,41 +770,44 @@
     status = pjmedia_sdp_neg_get_active_remote(inv->neg, &remote_sdp);
 
 
-    /* Create session info based on the two SDPs. 
-     * We only support one stream per session for now.
-     */
-    status = pjmedia_session_info_from_sdp(inv->dlg->pool, g_med_endpt, 
-					   1, &sess_info, 
-					   local_sdp, remote_sdp);
+    /* Create stream info based on the media audio SDP. */
+    status = pjmedia_stream_info_from_sdp(&stream_info, inv->dlg->pool,
+					  g_med_endpt,
+					  local_sdp, remote_sdp, 0);
     if (status != PJ_SUCCESS) {
-	app_perror( THIS_FILE, "Unable to create media session", status);
+	app_perror(THIS_FILE,"Unable to create audio stream info",status);
 	return;
     }
 
-    /* If required, we can also change some settings in the session info,
+    /* If required, we can also change some settings in the stream info,
      * (such as jitter buffer settings, codec settings, etc) before we
-     * create the session.
+     * create the stream.
      */
 
-    /* Create new media session, passing the two SDPs, and also the
+    /* Create new audio media stream, passing the stream info, and also the
      * media socket that we created earlier.
-     * The media session is active immediately.
      */
-    status = pjmedia_session_create( g_med_endpt, &sess_info,
-				     &g_med_transport, NULL, &g_med_session );
+    status = pjmedia_stream_create(g_med_endpt, inv->dlg->pool, &stream_info,
+				   g_med_transport[0], NULL, &g_med_stream);
     if (status != PJ_SUCCESS) {
-	app_perror( THIS_FILE, "Unable to create media session", status);
+	app_perror( THIS_FILE, "Unable to create audio stream", status);
 	return;
     }
 
+    /* Start the audio stream */
+    status = pjmedia_stream_start(g_med_stream);
+    if (status != PJ_SUCCESS) {
+	app_perror( THIS_FILE, "Unable to start audio stream", status);
+	return;
+    }
 
-    /* Get the media port interface of the first stream in the session. 
+    /* Get the media port interface of the audio stream. 
      * Media port interface is basicly a struct containing get_frame() and
      * put_frame() function. With this media port interface, we can attach
      * the port interface to conference bridge, or directly to a sound
      * player/recorder device.
      */
-    pjmedia_session_get_port(g_med_session, 0, &media_port);
+    pjmedia_stream_get_port(g_med_stream, &media_port);
 
 
 
@@ -745,6 +856,149 @@
 
     status = pjmedia_snd_port_connect(g_snd_rec, media_port);
 
+
+    /* Get the media port interface of the second stream in the session,
+     * which is video stream. With this media port interface, we can attach
+     * the port directly to a renderer/capture video device.
+     */
+    if (local_sdp->media_count > 1) {
+	pjmedia_vid_stream_info vstream_info;
+	pjmedia_vid_port_param vport_param;
+
+	/* Create stream info based on the media video SDP. */
+	status = pjmedia_vid_stream_info_from_sdp(&vstream_info,
+						  inv->dlg->pool, g_med_endpt,
+						  local_sdp, remote_sdp, 1);
+	if (status != PJ_SUCCESS) {
+	    app_perror(THIS_FILE,"Unable to create video stream info",status);
+	    return;
+	}
+
+	/* If required, we can also change some settings in the stream info,
+	 * (such as jitter buffer settings, codec settings, etc) before we
+	 * create the video stream.
+	 */
+
+	/* Create new video media stream, passing the stream info, and also the
+	 * media socket that we created earlier.
+	 */
+	status = pjmedia_vid_stream_create(g_med_endpt, inv->dlg->pool,
+					   &vstream_info, g_med_transport[1],
+					   NULL, &g_med_vstream);
+	if (status != PJ_SUCCESS) {
+	    app_perror( THIS_FILE, "Unable to create video stream", status);
+	    return;
+	}
+
+	/* Start the video stream */
+	status = pjmedia_vid_stream_start(g_med_vstream);
+	if (status != PJ_SUCCESS) {
+	    app_perror( THIS_FILE, "Unable to start video stream", status);
+	    return;
+	}
+
+
+	if (vstream_info.dir & PJMEDIA_DIR_DECODING) {
+	    status = pjmedia_vid_dev_default_param(
+				inv->pool, PJMEDIA_VID_DEFAULT_RENDER_DEV,
+				&vport_param.vidparam);
+	    if (status != PJ_SUCCESS) {
+		app_perror(THIS_FILE, "Unable to get default param of video "
+			   "renderer device", status);
+		return;
+	    }
+
+	    /* Get renderer format from decoding format in stream info */
+	    pjmedia_format_copy(&vport_param.vidparam.fmt, 
+				&vstream_info.codec_param->dec_fmt);
+	    vport_param.vidparam.dir = PJMEDIA_DIR_RENDER;
+	    vport_param.active = PJ_TRUE;
+
+	    /* Create renderer */
+	    status = pjmedia_vid_port_create(inv->pool, &vport_param, 
+					     &g_vid_renderer);
+	    if (status != PJ_SUCCESS) {
+		app_perror(THIS_FILE, "Unable to create video renderer device",
+			   status);
+		return;
+	    }
+
+	    /* Get video stream port for decoding direction */
+	    pjmedia_vid_stream_get_port(g_med_vstream, PJMEDIA_DIR_DECODING,
+					&media_port);
+
+	    /* Connect renderer to media_port */
+	    status = pjmedia_vid_port_connect(g_vid_renderer, media_port, 
+					      PJ_FALSE);
+	    if (status != PJ_SUCCESS) {
+		app_perror(THIS_FILE, "Unable to connect renderer to stream",
+			   status);
+		return;
+	    }
+	}
+
+	/* Create capturer */
+	if (vstream_info.dir & PJMEDIA_DIR_ENCODING) {
+	    status = pjmedia_vid_dev_default_param(
+				inv->pool, PJMEDIA_VID_DEFAULT_CAPTURE_DEV,
+				&vport_param.vidparam);
+	    if (status != PJ_SUCCESS) {
+		app_perror(THIS_FILE, "Unable to get default param of video "
+			   "capture device", status);
+		return;
+	    }
+
+	    /* Get renderer capturer from encoding format in stream info */
+	    pjmedia_format_copy(&vport_param.vidparam.fmt, 
+				&vstream_info.codec_param->enc_fmt);
+
+	    /* Capturer format ID should be copied from decoder format ID? */
+	    vport_param.vidparam.fmt.id = vstream_info.codec_param->dec_fmt.id;
+	    vport_param.vidparam.dir = PJMEDIA_DIR_CAPTURE;
+	    vport_param.active = PJ_TRUE;
+
+	    /* Create capturer */
+	    status = pjmedia_vid_port_create(inv->pool, &vport_param, 
+					     &g_vid_capturer);
+	    if (status != PJ_SUCCESS) {
+		app_perror(THIS_FILE, "Unable to create video capture device",
+			   status);
+		return;
+	    }
+
+	    /* Get video stream port for decoding direction */
+	    pjmedia_vid_stream_get_port(g_med_vstream, PJMEDIA_DIR_ENCODING,
+					&media_port);
+
+	    /* Connect capturer to media_port */
+	    status = pjmedia_vid_port_connect(g_vid_capturer, media_port, 
+					      PJ_FALSE);
+	    if (status != PJ_SUCCESS) {
+		app_perror(THIS_FILE, "Unable to connect capturer to stream",
+			   status);
+		return;
+	    }
+	}
+
+	/* Start streaming */
+	if (g_vid_renderer) {
+	    status = pjmedia_vid_port_start(g_vid_renderer);
+	    if (status != PJ_SUCCESS) {
+		app_perror(THIS_FILE, "Unable to start video renderer",
+			   status);
+		return;
+	    }
+	}
+	if (g_vid_capturer) {
+	    status = pjmedia_vid_port_start(g_vid_capturer);
+	    if (status != PJ_SUCCESS) {
+		app_perror(THIS_FILE, "Unable to start video capturer",
+			   status);
+		return;
+	    }
+	}
+    }
+
     /* Done with media. */
 }
 
diff --git a/pjsip-apps/src/samples/vid_streamutil.c b/pjsip-apps/src/samples/vid_streamutil.c
new file mode 100644
index 0000000..8b3e4e1
--- /dev/null
+++ b/pjsip-apps/src/samples/vid_streamutil.c
@@ -0,0 +1,907 @@
+/* $Id$ */
+/* 
+ * Copyright (C) 2011 Teluu Inc. (http://www.teluu.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
+ */
+
+
+/**
+ * \page page_pjmedia_samples_vid_streamutil_c Samples: Video Streaming
+ *
+ * This example mainly demonstrates how to stream video to remote
+ * peer using RTP.
+ *
+ * This file is pjsip-apps/src/samples/vid_streamutil.c
+ *
+ * \includelineno vid_streamutil.c
+ */
+
+#include <pjlib.h>
+#include <pjlib-util.h>
+#include <pjmedia.h>
+#include <pjmedia-codec.h>
+#include <pjmedia/transport_srtp.h>
+
+#include <stdlib.h>	/* atoi() */
+#include <stdio.h>
+
+#include "util.h"
+
+
+static const char *desc = 
+ " vid_streamutil                                                       \n"
+ "\n"
+ " PURPOSE:                                                             \n"
+ "  Demonstrate how to use pjmedia video stream component to		\n"
+ "  transmit/receive RTP packets to/from video device/file.		\n"
+ "\n"
+ "\n"
+ " USAGE:                                                               \n"
+ "  vid_streamutil [options]                                            \n"
+ "\n"
+ "\n"
+ " Options:                                                             \n"
+ "  --codec=CODEC         Set the codec name.                           \n"
+ "  --local-port=PORT     Set local RTP port (default=4000)             \n"
+ "  --remote=IP:PORT      Set the remote peer. If this option is set,   \n"
+ "                        the program will transmit RTP audio to the    \n"
+ "                        specified address. (default: recv only)       \n"
+ "  --play-file=AVI       Send video from the AVI file instead of from  \n"
+ "                        the video device.                             \n"
+ "  --send-recv           Set stream direction to bidirectional.        \n"
+ "  --send-only           Set stream direction to send only             \n"
+ "  --recv-only           Set stream direction to recv only (default)   \n"
+ 
+ "  --send-width          Video width to be sent                        \n"
+ "  --send-height         Video height to be sent                       \n"
+ "                        --send-width and --send-height not applicable \n"
+ "                        for file streaming (see --play-file)          \n"
+
+ "  --send-pt             Payload type for sending                      \n"
+ "  --recv-pt             Payload type for receiving                    \n"
+
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+ "  --use-srtp[=NAME]     Enable SRTP with crypto suite NAME            \n"
+ "                        e.g: AES_CM_128_HMAC_SHA1_80 (default),       \n"
+ "                             AES_CM_128_HMAC_SHA1_32                  \n"
+ "                        Use this option along with the TX & RX keys,  \n"
+ "                        formated of 60 hex digits (e.g: E148DA..)     \n"
+ "  --srtp-tx-key         SRTP key for transmiting                      \n"
+ "  --srtp-rx-key         SRTP key for receiving                        \n"
+#endif
+
+ "\n"
+;
+
+#define THIS_FILE	"vid_streamutil.c"
+
+#define HAS_LOCAL_RENDERER_FOR_PLAY_FILE    1
+#define DEF_RENDERER_WIDTH		    0
+#define DEF_RENDERER_HEIGHT		    0
+
+/* Prototype */
+static void print_stream_stat(pjmedia_vid_stream *stream,
+			      const pjmedia_vid_codec_param *codec_param);
+
+/* Prototype for LIBSRTP utility in file datatypes.c */
+int hex_string_to_octet_string(char *raw, char *hex, int len);
+
+/* 
+ * Register all codecs. 
+ */
+static pj_status_t init_codecs(pj_pool_factory *pf)
+{
+    pj_status_t status;
+
+    /* To suppress warning about unused var when all codecs are disabled */
+    PJ_UNUSED_ARG(status);
+
+#if defined(PJMEDIA_HAS_FFMPEG_CODEC) && PJMEDIA_HAS_FFMPEG_CODEC != 0
+    status = pjmedia_codec_ffmpeg_init(NULL, pf);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);
+#endif
+
+    return PJ_SUCCESS;
+}
+
+static pj_status_t create_file_player( pj_pool_t *pool,
+				       const char *file_name,
+				       pjmedia_port **p_play_port)
+{
+    pjmedia_avi_streams *avi_streams;
+    pjmedia_avi_stream *vid_stream;
+    pjmedia_port *play_port;
+    pj_status_t status;
+
+    status = pjmedia_avi_player_create_streams(pool, file_name, 0, &avi_streams);
+    if (status != PJ_SUCCESS)
+	return status;
+
+    vid_stream = pjmedia_avi_streams_get_stream_by_media(avi_streams,
+                                                         0,
+                                                         PJMEDIA_TYPE_VIDEO);
+    if (!vid_stream)
+	return PJ_ENOTFOUND;
+
+    play_port = pjmedia_avi_stream_get_port(vid_stream);
+    pj_assert(play_port);
+
+    *p_play_port = play_port;
+
+    return PJ_SUCCESS;
+}
+
+/* 
+ * Create stream based on the codec, dir, remote address, etc. 
+ */
+static pj_status_t create_stream( pj_pool_t *pool,
+				  pjmedia_endpt *med_endpt,
+				  const pjmedia_vid_codec_info *codec_info,
+                                  pjmedia_vid_codec_param *codec_param,
+				  pjmedia_dir dir,
+				  pj_int8_t rx_pt,
+				  pj_int8_t tx_pt,
+				  pj_uint16_t local_port,
+				  const pj_sockaddr_in *rem_addr,
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+				  pj_bool_t use_srtp,
+				  const pj_str_t *crypto_suite,
+				  const pj_str_t *srtp_tx_key,
+				  const pj_str_t *srtp_rx_key,
+#endif
+				  pjmedia_vid_stream **p_stream )
+{
+    pjmedia_vid_stream_info info;
+    pjmedia_transport *transport = NULL;
+    pj_status_t status;
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+    pjmedia_transport *srtp_tp = NULL;
+#endif
+
+    /* Reset stream info. */
+    pj_bzero(&info, sizeof(info));
+
+    /* Initialize stream info formats */
+    info.type = PJMEDIA_TYPE_VIDEO;
+    info.dir = dir;
+    info.codec_info = *codec_info;
+    info.tx_pt = (tx_pt == -1)? codec_info->pt : tx_pt;
+    info.rx_pt = (rx_pt == -1)? codec_info->pt : rx_pt;
+    info.ssrc = pj_rand();
+    if (codec_param)
+        info.codec_param = codec_param;
+    
+#if PJMEDIA_HAS_RTCP_XR && PJMEDIA_STREAM_ENABLE_XR
+    /* Set default RTCP XR enabled/disabled */
+    info.rtcp_xr_enabled = PJ_TRUE;
+#endif
+
+    /* Copy remote address */
+    pj_memcpy(&info.rem_addr, rem_addr, sizeof(pj_sockaddr_in));
+
+    /* If remote address is not set, set to an arbitrary address
+     * (otherwise stream will assert).
+     */
+    if (info.rem_addr.addr.sa_family == 0) {
+	const pj_str_t addr = pj_str("127.0.0.1");
+	pj_sockaddr_in_init(&info.rem_addr.ipv4, &addr, 0);
+    }
+
+    /* Create media transport */
+    status = pjmedia_transport_udp_create(med_endpt, NULL, local_port,
+					  0, &transport);
+    if (status != PJ_SUCCESS)
+	return status;
+
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+    /* Check if SRTP enabled */
+    if (use_srtp) {
+	pjmedia_srtp_crypto tx_plc, rx_plc;
+
+	status = pjmedia_transport_srtp_create(med_endpt, transport, 
+					       NULL, &srtp_tp);
+	if (status != PJ_SUCCESS)
+	    return status;
+
+	pj_bzero(&tx_plc, sizeof(pjmedia_srtp_crypto));
+	pj_bzero(&rx_plc, sizeof(pjmedia_srtp_crypto));
+
+	tx_plc.key = *srtp_tx_key;
+	tx_plc.name = *crypto_suite;
+	rx_plc.key = *srtp_rx_key;
+	rx_plc.name = *crypto_suite;
+	
+	status = pjmedia_transport_srtp_start(srtp_tp, &tx_plc, &rx_plc);
+	if (status != PJ_SUCCESS)
+	    return status;
+
+	transport = srtp_tp;
+    }
+#endif
+
+    /* Now that the stream info is initialized, we can create the 
+     * stream.
+     */
+
+    status = pjmedia_vid_stream_create( med_endpt, pool, &info, 
+					transport, 
+					NULL, p_stream);
+
+    if (status != PJ_SUCCESS) {
+	app_perror(THIS_FILE, "Error creating stream", status);
+	pjmedia_transport_close(transport);
+	return status;
+    }
+
+
+    return PJ_SUCCESS;
+}
+
+
+typedef struct play_file_data
+{
+    const char *file_name;
+    pjmedia_port *play_port;
+    pjmedia_port *stream_port;
+    pjmedia_vid_codec *decoder;
+    pjmedia_port *renderer;
+    void *read_buf;
+    pj_size_t read_buf_size;
+    void *dec_buf;
+    pj_size_t dec_buf_size;
+} play_file_data;
+
+
+static void clock_cb(const pj_timestamp *ts, void *user_data)
+{
+    play_file_data *play_file = (play_file_data*)user_data;
+    pjmedia_frame read_frame, write_frame;
+    pj_status_t status;
+
+    PJ_UNUSED_ARG(ts);
+
+    /* Read frame from file */
+    read_frame.buf = play_file->read_buf;
+    read_frame.size = play_file->read_buf_size;
+    pjmedia_port_get_frame(play_file->play_port, &read_frame);
+
+    /* Decode frame, if needed */
+    if (play_file->decoder) {
+	pjmedia_vid_codec *decoder = play_file->decoder;
+
+	write_frame.buf = play_file->dec_buf;
+	write_frame.size = play_file->dec_buf_size;
+	status = decoder->op->decode(decoder, &read_frame, write_frame.size,
+				     &write_frame);
+	if (status != PJ_SUCCESS)
+	    return;
+    } else {
+	write_frame = read_frame;
+    }
+
+    /* Display frame locally */
+    if (play_file->renderer)
+	pjmedia_port_put_frame(play_file->renderer, &write_frame);
+
+    /* Send frame */
+    pjmedia_port_put_frame(play_file->stream_port, &write_frame);
+}
+
+
+/*
+ * usage()
+ */
+static void usage()
+{
+    puts(desc);
+}
+
+/*
+ * main()
+ */
+int main(int argc, char *argv[])
+{
+    pj_caching_pool cp;
+    pjmedia_endpt *med_endpt;
+    pj_pool_t *pool;
+    pjmedia_vid_stream *stream = NULL;
+    pjmedia_port *enc_port, *dec_port;
+    pj_status_t status; 
+
+    pjmedia_vid_port *capture=NULL, *renderer=NULL;
+    pjmedia_vid_port_param vpp;
+
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+    /* SRTP variables */
+    pj_bool_t use_srtp = PJ_FALSE;
+    char tmp_tx_key[64];
+    char tmp_rx_key[64];
+    pj_str_t  srtp_tx_key = {NULL, 0};
+    pj_str_t  srtp_rx_key = {NULL, 0};
+    pj_str_t  srtp_crypto_suite = {NULL, 0};
+    int	tmp_key_len;
+#endif
+
+    /* Default values */
+    const pjmedia_vid_codec_info *codec_info;
+    pjmedia_vid_codec_param codec_param;
+    pjmedia_dir dir = PJMEDIA_DIR_DECODING;
+    pj_sockaddr_in remote_addr;
+    pj_uint16_t local_port = 4000;
+    char *codec_id = NULL;
+    pjmedia_rect_size tx_size = {0};
+    pj_int8_t rx_pt = -1, tx_pt = -1;
+
+    play_file_data play_file = { NULL };
+    pjmedia_port *play_port = NULL;
+    pjmedia_vid_codec *play_decoder = NULL;
+    pjmedia_clock *play_clock = NULL;
+
+    enum {
+	OPT_CODEC	= 'c',
+	OPT_LOCAL_PORT	= 'p',
+	OPT_REMOTE	= 'r',
+	OPT_PLAY_FILE	= 'f',
+	OPT_SEND_RECV	= 'b',
+	OPT_SEND_ONLY	= 's',
+	OPT_RECV_ONLY	= 'i',
+	OPT_SEND_WIDTH	= 'W',
+	OPT_SEND_HEIGHT	= 'H',
+	OPT_RECV_PT	= 't',
+	OPT_SEND_PT	= 'T',
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+	OPT_USE_SRTP	= 'S',
+#endif
+	OPT_SRTP_TX_KEY	= 'x',
+	OPT_SRTP_RX_KEY	= 'y',
+	OPT_HELP	= 'h',
+    };
+
+    struct pj_getopt_option long_options[] = {
+	{ "codec",	    1, 0, OPT_CODEC },
+	{ "local-port",	    1, 0, OPT_LOCAL_PORT },
+	{ "remote",	    1, 0, OPT_REMOTE },
+	{ "play-file",	    1, 0, OPT_PLAY_FILE },
+	{ "send-recv",      0, 0, OPT_SEND_RECV },
+	{ "send-only",      0, 0, OPT_SEND_ONLY },
+	{ "recv-only",      0, 0, OPT_RECV_ONLY },
+	{ "send-width",     1, 0, OPT_SEND_WIDTH },
+	{ "send-height",    1, 0, OPT_SEND_HEIGHT },
+	{ "recv-pt",        1, 0, OPT_RECV_PT },
+	{ "send-pt",        1, 0, OPT_SEND_PT },
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+	{ "use-srtp",	    2, 0, OPT_USE_SRTP },
+	{ "srtp-tx-key",    1, 0, OPT_SRTP_TX_KEY },
+	{ "srtp-rx-key",    1, 0, OPT_SRTP_RX_KEY },
+#endif
+	{ "help",	    0, 0, OPT_HELP },
+	{ NULL, 0, 0, 0 },
+    };
+
+    int c;
+    int option_index;
+
+
+    pj_bzero(&remote_addr, sizeof(remote_addr));
+
+
+    /* init PJLIB : */
+    status = pj_init();
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
+
+    /* Parse arguments */
+    pj_optind = 0;
+    while((c=pj_getopt_long(argc,argv, "h", long_options, &option_index))!=-1)
+    {
+	switch (c) {
+	case OPT_CODEC:
+	    codec_id = pj_optarg;
+	    break;
+
+	case OPT_LOCAL_PORT:
+	    local_port = (pj_uint16_t) atoi(pj_optarg);
+	    if (local_port < 1) {
+		printf("Error: invalid local port %s\n", pj_optarg);
+		return 1;
+	    }
+	    break;
+
+	case OPT_REMOTE:
+	    {
+		pj_str_t ip = pj_str(strtok(pj_optarg, ":"));
+		pj_uint16_t port = (pj_uint16_t) atoi(strtok(NULL, ":"));
+
+		status = pj_sockaddr_in_init(&remote_addr, &ip, port);
+		if (status != PJ_SUCCESS) {
+		    app_perror(THIS_FILE, "Invalid remote address", status);
+		    return 1;
+		}
+	    }
+	    break;
+
+	case OPT_PLAY_FILE:
+	    play_file.file_name = pj_optarg;
+	    break;
+
+	case OPT_SEND_RECV:
+	    dir = PJMEDIA_DIR_ENCODING_DECODING;
+	    break;
+
+	case OPT_SEND_ONLY:
+	    dir = PJMEDIA_DIR_ENCODING;
+	    break;
+
+	case OPT_RECV_ONLY:
+	    dir = PJMEDIA_DIR_DECODING;
+	    break;
+
+	case OPT_SEND_WIDTH:
+	    tx_size.w = (unsigned)atoi(pj_optarg);
+	    break;
+
+	case OPT_SEND_HEIGHT:
+	    tx_size.h = (unsigned)atoi(pj_optarg);
+	    break;
+
+	case OPT_RECV_PT:
+	    rx_pt = (pj_int8_t)atoi(pj_optarg);
+	    break;
+
+	case OPT_SEND_PT:
+	    tx_pt = (pj_int8_t)atoi(pj_optarg);
+	    break;
+
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+	case OPT_USE_SRTP:
+	    use_srtp = PJ_TRUE;
+	    if (pj_optarg) {
+		pj_strset(&srtp_crypto_suite, pj_optarg, strlen(pj_optarg));
+	    } else {
+		srtp_crypto_suite = pj_str("AES_CM_128_HMAC_SHA1_80");
+	    }
+	    break;
+
+	case OPT_SRTP_TX_KEY:
+	    tmp_key_len = hex_string_to_octet_string(tmp_tx_key, pj_optarg, 
+						     strlen(pj_optarg));
+	    pj_strset(&srtp_tx_key, tmp_tx_key, tmp_key_len/2);
+	    break;
+
+	case OPT_SRTP_RX_KEY:
+	    tmp_key_len = hex_string_to_octet_string(tmp_rx_key, pj_optarg,
+						     strlen(pj_optarg));
+	    pj_strset(&srtp_rx_key, tmp_rx_key, tmp_key_len/2);
+	    break;
+#endif
+
+	case OPT_HELP:
+	    usage();
+	    return 1;
+
+	default:
+	    printf("Invalid options %s\n", argv[pj_optind]);
+	    return 1;
+	}
+
+    }
+
+
+    /* Verify arguments. */
+    if (dir & PJMEDIA_DIR_ENCODING) {
+	if (remote_addr.sin_addr.s_addr == 0) {
+	    printf("Error: remote address must be set\n");
+	    return 1;
+	}
+    }
+
+    if (play_file.file_name != NULL && dir != PJMEDIA_DIR_ENCODING) {
+	printf("Direction is set to --send-only because of --play-file\n");
+	dir = PJMEDIA_DIR_ENCODING;
+    }
+
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+    /* SRTP validation */
+    if (use_srtp) {
+	if (!srtp_tx_key.slen || !srtp_rx_key.slen)
+	{
+	    printf("Error: Key for each SRTP stream direction must be set\n");
+	    return 1;
+	}
+    }
+#endif
+
+    /* Must create a pool factory before we can allocate any memory. */
+    pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0);
+
+    /* 
+     * Initialize media endpoint.
+     * This will implicitly initialize PJMEDIA too.
+     */
+    status = pjmedia_endpt_create(&cp.factory, NULL, 1, &med_endpt);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
+    /* Create memory pool for application purpose */
+    pool = pj_pool_create( &cp.factory,	    /* pool factory	    */
+			   "app",	    /* pool name.	    */
+			   4000,	    /* init size	    */
+			   4000,	    /* increment size	    */
+			   NULL		    /* callback on error    */
+			   );
+
+    /* Init video format manager */
+    pjmedia_video_format_mgr_create(pool, 64, 0, NULL);
+
+    /* Init video converter manager */
+    pjmedia_converter_mgr_create(pool, NULL);
+
+    /* Init video codec manager */
+    pjmedia_vid_codec_mgr_create(pool, NULL);
+
+    /* Init video subsystem */
+    pjmedia_vid_subsys_init(&cp.factory);
+
+    /* Register all supported codecs */
+    status = init_codecs(&cp.factory);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
+
+    /* Find which codec to use. */
+    if (codec_id) {
+	unsigned count = 1;
+	pj_str_t str_codec_id = pj_str(codec_id);
+
+        status = pjmedia_vid_codec_mgr_find_codecs_by_id(NULL,
+						         &str_codec_id, &count,
+						         &codec_info, NULL);
+	if (status != PJ_SUCCESS) {
+	    printf("Error: unable to find codec %s\n", codec_id);
+	    return 1;
+	}
+    } else {
+        static pjmedia_vid_codec_info info[1];
+        unsigned count = PJ_ARRAY_SIZE(info);
+
+	/* Default to first codec */
+	pjmedia_vid_codec_mgr_enum_codecs(NULL, &count, info, NULL);
+        codec_info = &info[0];
+    }
+
+    /* Get codec default param for info */
+    status = pjmedia_vid_codec_mgr_get_default_param(NULL, codec_info, 
+				                     &codec_param);
+    pj_assert(status == PJ_SUCCESS);
+    
+    /* Set outgoing video size */
+    if (tx_size.w && tx_size.h)
+        codec_param.enc_fmt.det.vid.size = tx_size;
+
+#if DEF_RENDERER_WIDTH && DEF_RENDERER_HEIGHT
+    /* Set incoming video size */
+    codec_param.dec_fmt.det.vid.size.w = DEF_RENDERER_WIDTH;
+    codec_param.dec_fmt.det.vid.size.h = DEF_RENDERER_HEIGHT;
+#endif
+
+    if (play_file.file_name) {
+	pjmedia_video_format_detail *file_vfd;
+
+	/* Create file player */
+	status = create_file_player(pool, play_file.file_name, &play_port);
+	if (status != PJ_SUCCESS)
+	    goto on_exit;
+
+	/* Collect format info */
+	file_vfd = pjmedia_format_get_video_format_detail(&play_port->info.fmt,
+							  PJ_TRUE);
+	PJ_LOG(2, (THIS_FILE, "Reading video stream %dx%d %c%c%c%c @%.2dfps",
+		   file_vfd->size.w, file_vfd->size.h,
+		   ((play_port->info.fmt.id & 0x000000FF) >> 0),
+		   ((play_port->info.fmt.id & 0x0000FF00) >> 8),
+		   ((play_port->info.fmt.id & 0x00FF0000) >> 16),
+		   ((play_port->info.fmt.id & 0xFF000000) >> 24),
+		   file_vfd->fps.num/file_vfd->fps.denum));
+
+	/* Allocate file read buffer */
+	play_file.read_buf_size = PJMEDIA_MAX_VIDEO_ENC_FRAME_SIZE;
+	play_file.read_buf = pj_pool_zalloc(pool, play_file.read_buf_size);
+
+	/* Create decoder, if the file and the stream uses different codec */
+	if (codec_info->fmt_id != (pjmedia_format_id)play_port->info.fmt.id) {
+	    const pjmedia_video_format_info *dec_vfi;
+	    pjmedia_video_apply_fmt_param dec_vafp = {0};
+	    const pjmedia_vid_codec_info *codec_info2;
+	    pjmedia_vid_codec_param codec_param2;
+
+	    /* Find decoder */
+	    status = pjmedia_vid_codec_mgr_get_codec_info2(NULL,
+							   play_port->info.fmt.id,
+							   &codec_info2);
+	    if (status != PJ_SUCCESS)
+		goto on_exit;
+
+	    /* Init decoder */
+	    status = pjmedia_vid_codec_mgr_alloc_codec(NULL, codec_info2,
+						       &play_decoder);
+	    if (status != PJ_SUCCESS)
+		goto on_exit;
+
+	    status = play_decoder->op->init(play_decoder, pool);
+	    if (status != PJ_SUCCESS)
+		goto on_exit;
+
+	    /* Open decoder */
+	    status = pjmedia_vid_codec_mgr_get_default_param(NULL, codec_info2,
+							     &codec_param2);
+	    if (status != PJ_SUCCESS)
+		goto on_exit;
+
+	    status = play_decoder->op->open(play_decoder, &codec_param2);
+	    if (status != PJ_SUCCESS)
+		goto on_exit;
+
+	    /* Get decoder format info and apply param */
+	    dec_vfi = pjmedia_get_video_format_info(NULL,
+						    codec_info2->dec_fmt_id[0]);
+	    if (!dec_vfi || !dec_vfi->apply_fmt) {
+		status = PJ_ENOTSUP;
+		goto on_exit;
+	    }
+	    dec_vafp.size = file_vfd->size;
+	    (*dec_vfi->apply_fmt)(dec_vfi, &dec_vafp);
+
+	    /* Allocate buffer to receive decoder output */
+	    play_file.dec_buf_size = dec_vafp.framebytes;
+	    play_file.dec_buf = pj_pool_zalloc(pool, play_file.dec_buf_size);
+	}
+
+	/* Create player clock */
+	status = pjmedia_clock_create2(pool, PJMEDIA_PTIME(&file_vfd->fps),
+				       codec_info->clock_rate,
+				       PJMEDIA_CLOCK_NO_HIGHEST_PRIO,
+				       &clock_cb, &play_file, &play_clock);
+	if (status != PJ_SUCCESS)
+	    goto on_exit;
+
+	/* Override stream codec param for encoding direction */
+	codec_param.enc_fmt.det.vid.size = file_vfd->size;
+	codec_param.enc_fmt.det.vid.fps  = file_vfd->fps;
+
+    } else {
+        pjmedia_vid_port_param_default(&vpp);
+
+        /* Set as active for all video devices */
+        vpp.active = PJ_TRUE;
+
+	/* Create video device port. */
+        if (dir & PJMEDIA_DIR_ENCODING) {
+            /* Create capture */
+            status = pjmedia_vid_dev_default_param(
+					pool,
+					0,//PJMEDIA_VID_DEFAULT_CAPTURE_DEV,
+					&vpp.vidparam);
+            if (status != PJ_SUCCESS)
+	        goto on_exit;
+
+            pjmedia_format_copy(&vpp.vidparam.fmt, &codec_param.dec_fmt);
+            vpp.vidparam.dir = PJMEDIA_DIR_CAPTURE;
+            
+            status = pjmedia_vid_port_create(pool, &vpp, &capture);
+            if (status != PJ_SUCCESS)
+	        goto on_exit;
+        }
+	
+        if (dir & PJMEDIA_DIR_DECODING) {
+            /* Create renderer */
+            status = pjmedia_vid_dev_default_param(
+					pool,
+					1,//PJMEDIA_VID_DEFAULT_RENDER_DEV,
+					&vpp.vidparam);
+            if (status != PJ_SUCCESS)
+	        goto on_exit;
+
+            pjmedia_format_copy(&vpp.vidparam.fmt, &codec_param.dec_fmt);
+            vpp.vidparam.dir = PJMEDIA_DIR_RENDER;
+            vpp.vidparam.disp_size = vpp.vidparam.fmt.det.vid.size;
+
+            status = pjmedia_vid_port_create(pool, &vpp, &renderer);
+            if (status != PJ_SUCCESS)
+	        goto on_exit;
+        }
+    }
+
+    /* Create stream based on program arguments */
+    status = create_stream(pool, med_endpt, codec_info, &codec_param,
+                           dir, rx_pt, tx_pt, local_port, &remote_addr, 
+#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
+			   use_srtp, &srtp_crypto_suite, 
+			   &srtp_tx_key, &srtp_rx_key,
+#endif
+			   &stream);
+    if (status != PJ_SUCCESS)
+	goto on_exit;
+
+    /* Get the port interface of the stream */
+    status = pjmedia_vid_stream_get_port(stream, PJMEDIA_DIR_ENCODING,
+				         &enc_port);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
+    status = pjmedia_vid_stream_get_port(stream, PJMEDIA_DIR_DECODING,
+				         &dec_port);
+    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
+
+    /* Start streaming */
+    status = pjmedia_vid_stream_start(stream);
+    if (status != PJ_SUCCESS)
+        goto on_exit;
+
+    /* Start renderer */
+    if (renderer) {
+        status = pjmedia_vid_port_connect(renderer, dec_port, PJ_FALSE);
+        if (status != PJ_SUCCESS)
+	    goto on_exit;
+        status = pjmedia_vid_port_start(renderer);
+        if (status != PJ_SUCCESS)
+            goto on_exit;
+    }
+
+    /* Start capture */
+    if (capture) {
+        status = pjmedia_vid_port_connect(capture, enc_port, PJ_FALSE);
+        if (status != PJ_SUCCESS)
+	    goto on_exit;
+        status = pjmedia_vid_port_start(capture);
+        if (status != PJ_SUCCESS)
+            goto on_exit;
+    }
+
+    /* Start playing file */
+    if (play_file.file_name) {
+
+#if HAS_LOCAL_RENDERER_FOR_PLAY_FILE
+        /* Create local renderer */
+        pjmedia_vid_port_param_default(&vpp);
+        vpp.active = PJ_FALSE;
+        status = pjmedia_vid_dev_default_param(
+				pool,
+				1,//PJMEDIA_VID_DEFAULT_RENDER_DEV,
+				&vpp.vidparam);
+        if (status != PJ_SUCCESS)
+	    goto on_exit;
+
+        vpp.vidparam.dir = PJMEDIA_DIR_RENDER;
+        pjmedia_format_copy(&vpp.vidparam.fmt, &codec_param.dec_fmt);
+	vpp.vidparam.fmt.det.vid.size = play_port->info.fmt.det.vid.size;
+	vpp.vidparam.fmt.det.vid.fps = play_port->info.fmt.det.vid.fps;
+        vpp.vidparam.disp_size = vpp.vidparam.fmt.det.vid.size;
+
+	status = pjmedia_vid_port_create(pool, &vpp, &renderer);
+        if (status != PJ_SUCCESS)
+	    goto on_exit;
+        status = pjmedia_vid_port_start(renderer);
+        if (status != PJ_SUCCESS)
+            goto on_exit;
+#endif
+
+	/* Init play file data */
+	play_file.play_port = play_port;
+	play_file.stream_port = enc_port;
+	play_file.decoder = play_decoder;
+	if (renderer) {
+	    play_file.renderer = pjmedia_vid_port_get_passive_port(renderer);
+	}
+
+	status = pjmedia_clock_start(play_clock);
+	if (status != PJ_SUCCESS)
+	    goto on_exit;
+    }
+
+    /* Done */
+
+    if (dir == PJMEDIA_DIR_DECODING)
+	printf("Stream is active, dir is recv-only, local port is %d\n",
+	       local_port);
+    else if (dir == PJMEDIA_DIR_ENCODING)
+	printf("Stream is active, dir is send-only, sending to %s:%d\n",
+	       pj_inet_ntoa(remote_addr.sin_addr),
+	       pj_ntohs(remote_addr.sin_port));
+    else
+	printf("Stream is active, send/recv, local port is %d, "
+	       "sending to %s:%d\n",
+	       local_port,
+	       pj_inet_ntoa(remote_addr.sin_addr),
+	       pj_ntohs(remote_addr.sin_port));
+
+    if (dir & PJMEDIA_DIR_ENCODING)
+	PJ_LOG(2, (THIS_FILE, "Sending %dx%d %.*s @%.2dfps",
+		   codec_param.enc_fmt.det.vid.size.w,
+		   codec_param.enc_fmt.det.vid.size.h,
+		   codec_info->encoding_name.slen,
+		   codec_info->encoding_name.ptr,
+		   codec_param.enc_fmt.det.vid.fps.num/
+		   codec_param.enc_fmt.det.vid.fps.denum));
+
+    for (;;) {
+	char tmp[10];
+
+	puts("");
+	puts("Commands:");
+	puts("  q     Quit");
+	puts("");
+
+	printf("Command: "); fflush(stdout);
+
+	if (fgets(tmp, sizeof(tmp), stdin) == NULL) {
+	    puts("EOF while reading stdin, will quit now..");
+	    break;
+	}
+
+	if (tmp[0] == 'q')
+	    break;
+
+    }
+
+
+
+    /* Start deinitialization: */
+on_exit:
+
+    /* Stop and destroy file clock */
+    if (play_clock) {
+	pjmedia_clock_stop(play_clock);
+	pjmedia_clock_destroy(play_clock);
+    }
+
+    /* Destroy file reader/player */
+    if (play_port)
+	pjmedia_port_destroy(play_port);
+
+    /* Destroy file decoder */
+    if (play_decoder)
+	play_decoder->op->close(play_decoder);
+
+    /* Destroy video devices */
+    if (capture)
+	pjmedia_vid_port_destroy(capture);
+    if (renderer)
+	pjmedia_vid_port_destroy(renderer);
+
+    /* Destroy stream */
+    if (stream) {
+	pjmedia_transport *tp;
+
+	tp = pjmedia_vid_stream_get_transport(stream);
+	pjmedia_vid_stream_destroy(stream);
+	
+	pjmedia_transport_close(tp);
+    }
+
+    /* Shutdown video subsystem */
+    pjmedia_vid_subsys_shutdown();
+
+    /* Release application pool */
+    pj_pool_release( pool );
+
+    /* Destroy media endpoint. */
+    pjmedia_endpt_destroy( med_endpt );
+
+    /* Destroy pool factory */
+    pj_caching_pool_destroy( &cp );
+
+    /* Shutdown PJLIB */
+    pj_shutdown();
+
+    return (status == PJ_SUCCESS) ? 0 : 1;
+}
diff --git a/pjsip-apps/src/samples/vstreamutil.c b/pjsip-apps/src/samples/vstreamutil.c
deleted file mode 100644
index 3290b99..0000000
--- a/pjsip-apps/src/samples/vstreamutil.c
+++ /dev/null
@@ -1,1259 +0,0 @@
-/* $Id$ */
-/* 
- * Copyright (C) 2008-2009 Teluu Inc. (http://www.teluu.com)
- * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
- */
-
-
-/**
- * \page page_pjmedia_samples_streamutil_c Samples: Remote Streaming
- *
- * This example mainly demonstrates how to stream media file to remote
- * peer using RTP.
- *
- * This file is pjsip-apps/src/samples/streamutil.c
- *
- * \includelineno streamutil.c
- */
-
-#include <pjlib.h>
-#include <pjlib-util.h>
-#include <pjmedia.h>
-#include <pjmedia-codec.h>
-#include <pjmedia/transport_srtp.h>
-
-#include <stdlib.h>	/* atoi() */
-#include <stdio.h>
-
-#include "util.h"
-
-
-static const char *desc = 
- " streamutil								\n"
- "									\n"
- " PURPOSE:								\n"
- "  Demonstrate how to use pjmedia stream component to transmit/receive \n"
- "  RTP packets to/from sound device.		    			\n"
- "\n"
- "\n"
- " USAGE:								\n"
- "  streamutil [options]                                                \n"
- "\n"
- "\n"
- " Options:\n"
- "  --codec=CODEC         Set the codec name.                           \n"
- "  --local-port=PORT     Set local RTP port (default=4000)		\n"
- "  --remote=IP:PORT      Set the remote peer. If this option is set,	\n"
- "                        the program will transmit RTP audio to the	\n"
- "                        specified address. (default: recv only)	\n"
- /*
- "  --play-file=WAV       Send audio from the WAV file instead of from	\n"
- "                        the sound device.				\n"
- "  --record-file=WAV     Record incoming audio to WAV file instead of	\n"
- "                        playing it to sound device.			\n"
- */
- "  --send-recv           Set stream direction to bidirectional.        \n"
- "  --send-only           Set stream direction to send only		\n"
- "  --recv-only           Set stream direction to recv only (default)   \n"
-
- "  --recv-width          Video width to be received                    \n"
- "  --recv-height         Video height to be received                   \n"
- "  --recv-pt             Payload type for receiving                    \n"
-
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
- "  --use-srtp[=NAME]     Enable SRTP with crypto suite NAME            \n"
- "                        e.g: AES_CM_128_HMAC_SHA1_80 (default),       \n"
- "                             AES_CM_128_HMAC_SHA1_32                  \n"
- "                        Use this option along with the TX & RX keys,  \n"
- "                        formated of 60 hex digits (e.g: E148DA..)      \n"
- "  --srtp-tx-key         SRTP key for transmiting                      \n"
- "  --srtp-rx-key         SRTP key for receiving                        \n"
-#endif
-
- "\n"
-;
-
-
-
-
-#define THIS_FILE	"stream.c"
-
-
-
-/* Prototype */
-static void print_stream_stat(pjmedia_stream *stream, 
-			      const pjmedia_codec_param *codec_param);
-
-/* Prototype for LIBSRTP utility in file datatypes.c */
-int hex_string_to_octet_string(char *raw, char *hex, int len);
-
-/* 
- * Register all codecs. 
- */
-static pj_status_t init_codecs(pj_pool_factory *pf)
-{
-    pj_status_t status;
-
-    /* To suppress warning about unused var when all codecs are disabled */
-    PJ_UNUSED_ARG(status);
-
-#if defined(PJMEDIA_HAS_FFMPEG_CODEC) && PJMEDIA_HAS_FFMPEG_CODEC != 0
-    status = pjmedia_codec_ffmpeg_init(NULL, pf);
-    PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);
-#endif
-
-    return PJ_SUCCESS;
-}
-
-
-/* 
- * Create stream based on the codec, dir, remote address, etc. 
- */
-static pj_status_t create_stream( pj_pool_t *pool,
-				  pjmedia_endpt *med_endpt,
-				  const pjmedia_vid_codec_info *codec_info,
-                                  pjmedia_vid_codec_param *codec_param,
-				  pjmedia_dir dir,
-				  pj_uint16_t local_port,
-				  const pj_sockaddr_in *rem_addr,
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
-				  pj_bool_t use_srtp,
-				  const pj_str_t *crypto_suite,
-				  const pj_str_t *srtp_tx_key,
-				  const pj_str_t *srtp_rx_key,
-#endif
-				  pjmedia_stream **p_stream )
-{
-    pjmedia_stream_info info;
-    pjmedia_transport *transport = NULL;
-    pj_status_t status;
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
-    pjmedia_transport *srtp_tp = NULL;
-#endif
-
-
-    /* Reset stream info. */
-    pj_bzero(&info, sizeof(info));
-
-
-    /* Initialize stream info formats */
-    info.type = PJMEDIA_TYPE_VIDEO;
-    info.dir = dir;
-    info.vid_codec_info = *codec_info;
-    info.tx_pt = codec_info->pt;
-    info.ssrc = pj_rand();
-    if (codec_param)
-        info.vid_codec_param = codec_param;
-    
-#if PJMEDIA_HAS_RTCP_XR && PJMEDIA_STREAM_ENABLE_XR
-    /* Set default RTCP XR enabled/disabled */
-    info.rtcp_xr_enabled = PJ_TRUE;
-#endif
-
-    /* Copy remote address */
-    pj_memcpy(&info.rem_addr, rem_addr, sizeof(pj_sockaddr_in));
-
-    /* If remote address is not set, set to an arbitrary address
-     * (otherwise stream will assert).
-     */
-    if (info.rem_addr.addr.sa_family == 0) {
-	const pj_str_t addr = pj_str("127.0.0.1");
-	pj_sockaddr_in_init(&info.rem_addr.ipv4, &addr, 0);
-    }
-
-    /* Create media transport */
-    status = pjmedia_transport_udp_create(med_endpt, NULL, local_port,
-					  0, &transport);
-    if (status != PJ_SUCCESS)
-	return status;
-
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
-    /* Check if SRTP enabled */
-    if (use_srtp) {
-	pjmedia_srtp_crypto tx_plc, rx_plc;
-
-	status = pjmedia_transport_srtp_create(med_endpt, transport, 
-					       NULL, &srtp_tp);
-	if (status != PJ_SUCCESS)
-	    return status;
-
-	pj_bzero(&tx_plc, sizeof(pjmedia_srtp_crypto));
-	pj_bzero(&rx_plc, sizeof(pjmedia_srtp_crypto));
-
-	tx_plc.key = *srtp_tx_key;
-	tx_plc.name = *crypto_suite;
-	rx_plc.key = *srtp_rx_key;
-	rx_plc.name = *crypto_suite;
-	
-	status = pjmedia_transport_srtp_start(srtp_tp, &tx_plc, &rx_plc);
-	if (status != PJ_SUCCESS)
-	    return status;
-
-	transport = srtp_tp;
-    }
-#endif
-
-    /* Now that the stream info is initialized, we can create the 
-     * stream.
-     */
-
-    status = pjmedia_stream_create( med_endpt, pool, &info, 
-				    transport, 
-				    NULL, p_stream);
-
-    if (status != PJ_SUCCESS) {
-	app_perror(THIS_FILE, "Error creating stream", status);
-	pjmedia_transport_close(transport);
-	return status;
-    }
-
-
-    return PJ_SUCCESS;
-}
-
-
-/*
- * usage()
- */
-static void usage()
-{
-    puts(desc);
-}
-
-/*
- * main()
- */
-int main(int argc, char *argv[])
-{
-    pj_caching_pool cp;
-    pjmedia_endpt *med_endpt;
-    pj_pool_t *pool;
-    pjmedia_port *rec_file_port = NULL, *play_file_port = NULL;
-    pjmedia_master_port *master_port = NULL;
-    pjmedia_stream *stream = NULL;
-    pjmedia_port *stream_port;
-    char tmp[10];
-    pj_status_t status; 
-
-    pjmedia_vid_port *capture=NULL, *renderer=NULL;
-    pjmedia_vid_port_param vpp;
-
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
-    /* SRTP variables */
-    pj_bool_t use_srtp = PJ_FALSE;
-    char tmp_tx_key[64];
-    char tmp_rx_key[64];
-    pj_str_t  srtp_tx_key = {NULL, 0};
-    pj_str_t  srtp_rx_key = {NULL, 0};
-    pj_str_t  srtp_crypto_suite = {NULL, 0};
-    int	tmp_key_len;
-#endif
-
-    /* Default values */
-    const pjmedia_vid_codec_info *codec_info;
-    pjmedia_vid_codec_param codec_param;
-    pjmedia_dir dir = PJMEDIA_DIR_DECODING;
-    pj_sockaddr_in remote_addr;
-    pj_uint16_t local_port = 4000;
-    char *codec_id = NULL;
-    char *rec_file = NULL;
-    char *play_file = NULL;
-    pjmedia_rect_size rx_size = {0};
-    pj_int8_t rx_pt = -1;
-
-    enum {
-	OPT_CODEC	= 'c',
-	OPT_LOCAL_PORT	= 'p',
-	OPT_REMOTE	= 'r',
-	OPT_PLAY_FILE	= 'I',
-	OPT_RECORD_FILE	= 'O',
-	OPT_SEND_RECV	= 'b',
-	OPT_SEND_ONLY	= 's',
-	OPT_RECV_ONLY	= 'i',
-	OPT_RECV_WIDTH	= 'W',
-	OPT_RECV_HEIGHT	= 'H',
-	OPT_RECV_PT	= 't',
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
-	OPT_USE_SRTP	= 'S',
-#endif
-	OPT_SRTP_TX_KEY	= 'x',
-	OPT_SRTP_RX_KEY	= 'y',
-	OPT_HELP	= 'h',
-    };
-
-    struct pj_getopt_option long_options[] = {
-	{ "codec",	    1, 0, OPT_CODEC },
-	{ "local-port",	    1, 0, OPT_LOCAL_PORT },
-	{ "remote",	    1, 0, OPT_REMOTE },
-	{ "play-file",	    1, 0, OPT_PLAY_FILE },
-	{ "record-file",    1, 0, OPT_RECORD_FILE },
-	{ "send-recv",      0, 0, OPT_SEND_RECV },
-	{ "send-only",      0, 0, OPT_SEND_ONLY },
-	{ "recv-only",      0, 0, OPT_RECV_ONLY },
-	{ "recv-width",     1, 0, OPT_RECV_WIDTH },
-	{ "recv-height",    1, 0, OPT_RECV_HEIGHT },
-	{ "recv-pt",        1, 0, OPT_RECV_PT },
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
-	{ "use-srtp",	    2, 0, OPT_USE_SRTP },
-	{ "srtp-tx-key",    1, 0, OPT_SRTP_TX_KEY },
-	{ "srtp-rx-key",    1, 0, OPT_SRTP_RX_KEY },
-#endif
-	{ "help",	    0, 0, OPT_HELP },
-	{ NULL, 0, 0, 0 },
-    };
-
-    int c;
-    int option_index;
-
-
-    pj_bzero(&remote_addr, sizeof(remote_addr));
-
-
-    /* init PJLIB : */
-    status = pj_init();
-    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
-
-
-    /* Parse arguments */
-    pj_optind = 0;
-    while((c=pj_getopt_long(argc,argv, "h", long_options, &option_index))!=-1) {
-
-	switch (c) {
-	case OPT_CODEC:
-	    codec_id = pj_optarg;
-	    break;
-
-	case OPT_LOCAL_PORT:
-	    local_port = (pj_uint16_t) atoi(pj_optarg);
-	    if (local_port < 1) {
-		printf("Error: invalid local port %s\n", pj_optarg);
-		return 1;
-	    }
-	    break;
-
-	case OPT_REMOTE:
-	    {
-		pj_str_t ip = pj_str(strtok(pj_optarg, ":"));
-		pj_uint16_t port = (pj_uint16_t) atoi(strtok(NULL, ":"));
-
-		status = pj_sockaddr_in_init(&remote_addr, &ip, port);
-		if (status != PJ_SUCCESS) {
-		    app_perror(THIS_FILE, "Invalid remote address", status);
-		    return 1;
-		}
-	    }
-	    break;
-
-	case OPT_PLAY_FILE:
-	    play_file = pj_optarg;
-	    break;
-
-	case OPT_RECORD_FILE:
-	    rec_file = pj_optarg;
-	    break;
-
-	case OPT_SEND_RECV:
-	    dir = PJMEDIA_DIR_ENCODING_DECODING;
-	    break;
-
-	case OPT_SEND_ONLY:
-	    dir = PJMEDIA_DIR_ENCODING;
-	    break;
-
-	case OPT_RECV_ONLY:
-	    dir = PJMEDIA_DIR_DECODING;
-	    break;
-
-	case OPT_RECV_WIDTH:
-	    rx_size.w = (unsigned)atoi(pj_optarg);
-	    break;
-
-	case OPT_RECV_HEIGHT:
-	    rx_size.h = (unsigned)atoi(pj_optarg);
-	    break;
-
-	case OPT_RECV_PT:
-	    rx_pt = (pj_int8_t)atoi(pj_optarg);
-	    break;
-
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
-	case OPT_USE_SRTP:
-	    use_srtp = PJ_TRUE;
-	    if (pj_optarg) {
-		pj_strset(&srtp_crypto_suite, pj_optarg, strlen(pj_optarg));
-	    } else {
-		srtp_crypto_suite = pj_str("AES_CM_128_HMAC_SHA1_80");
-	    }
-	    break;
-
-	case OPT_SRTP_TX_KEY:
-	    tmp_key_len = hex_string_to_octet_string(tmp_tx_key, pj_optarg, strlen(pj_optarg));
-	    pj_strset(&srtp_tx_key, tmp_tx_key, tmp_key_len/2);
-	    break;
-
-	case OPT_SRTP_RX_KEY:
-	    tmp_key_len = hex_string_to_octet_string(tmp_rx_key, pj_optarg, strlen(pj_optarg));
-	    pj_strset(&srtp_rx_key, tmp_rx_key, tmp_key_len/2);
-	    break;
-#endif
-
-	case OPT_HELP:
-	    usage();
-	    return 1;
-
-	default:
-	    printf("Invalid options %s\n", argv[pj_optind]);
-	    return 1;
-	}
-
-    }
-
-
-    /* Verify arguments. */
-    if (dir & PJMEDIA_DIR_ENCODING) {
-	if (remote_addr.sin_addr.s_addr == 0) {
-	    printf("Error: remote address must be set\n");
-	    return 1;
-	}
-    }
-
-    if (play_file != NULL && dir != PJMEDIA_DIR_ENCODING) {
-	printf("Direction is set to --send-only because of --play-file\n");
-	dir = PJMEDIA_DIR_ENCODING;
-    }
-
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
-    /* SRTP validation */
-    if (use_srtp) {
-	if (!srtp_tx_key.slen || !srtp_rx_key.slen)
-	{
-	    printf("Error: Key for each SRTP stream direction must be set\n");
-	    return 1;
-	}
-    }
-#endif
-
-    /* Must create a pool factory before we can allocate any memory. */
-    pj_caching_pool_init(&cp, &pj_pool_factory_default_policy, 0);
-
-    /* 
-     * Initialize media endpoint.
-     * This will implicitly initialize PJMEDIA too.
-     */
-    status = pjmedia_endpt_create(&cp.factory, NULL, 1, &med_endpt);
-    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
-
-    /* Create memory pool for application purpose */
-    pool = pj_pool_create( &cp.factory,	    /* pool factory	    */
-			   "app",	    /* pool name.	    */
-			   4000,	    /* init size	    */
-			   4000,	    /* increment size	    */
-			   NULL		    /* callback on error    */
-			   );
-
-    /* Init video format manager */
-    pjmedia_video_format_mgr_create(pool, 64, 0, NULL);
-
-    /* Init video codec manager */
-    pjmedia_vid_codec_mgr_create(pool, NULL);
-
-    /* Init video subsystem */
-    pjmedia_vid_subsys_init(&cp.factory);
-
-    /* Register all supported codecs */
-    status = init_codecs(&cp.factory);
-    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
-
-
-    /* Find which codec to use. */
-    if (codec_id) {
-	unsigned count = 1;
-	pj_str_t str_codec_id = pj_str(codec_id);
-
-        status = pjmedia_vid_codec_mgr_find_codecs_by_id(NULL,
-						         &str_codec_id, &count,
-						         &codec_info, NULL);
-	if (status != PJ_SUCCESS) {
-	    printf("Error: unable to find codec %s\n", codec_id);
-	    return 1;
-	}
-    } else {
-        static pjmedia_vid_codec_info info[1];
-        unsigned count = PJ_ARRAY_SIZE(info);
-
-	/* Default to first codec */
-	pjmedia_vid_codec_mgr_enum_codecs(NULL, &count, info, NULL);
-        codec_info = &info[0];
-    }
-
-    /* Get codec default param for info */
-    status = pjmedia_vid_codec_mgr_get_default_param(NULL, codec_info, 
-				                     &codec_param);
-    /* Should be ok, as create_stream() above succeeded */
-    pj_assert(status == PJ_SUCCESS);
-    if (rx_pt >= 0)
-        codec_param.pt = rx_pt;
-    if (rx_size.w && rx_size.h)
-        codec_param.dec_fmt.det.vid.size = rx_size;
-
-    /* Create stream based on program arguments */
-    status = create_stream(pool, med_endpt, codec_info, &codec_param,
-                           dir, local_port, &remote_addr, 
-#if defined(PJMEDIA_HAS_SRTP) && (PJMEDIA_HAS_SRTP != 0)
-			   use_srtp, &srtp_crypto_suite, 
-			   &srtp_tx_key, &srtp_rx_key,
-#endif
-			   &stream);
-    if (status != PJ_SUCCESS)
-	goto on_exit;
-
-    /* Get the port interface of the stream */
-    status = pjmedia_stream_get_port( stream, &stream_port);
-    PJ_ASSERT_RETURN(status == PJ_SUCCESS, 1);
-
-
-    if (play_file) {
-        /*
-	unsigned wav_ptime;
-
-	wav_ptime = PJMEDIA_PIA_PTIME(&stream_port->info);
-	status = pjmedia_wav_player_port_create(pool, play_file, wav_ptime,
-						0, -1, &play_file_port);
-	if (status != PJ_SUCCESS) {
-	    app_perror(THIS_FILE, "Unable to use file", status);
-	    goto on_exit;
-	}
-
-	status = pjmedia_master_port_create(pool, play_file_port, stream_port,
-					    0, &master_port);
-	if (status != PJ_SUCCESS) {
-	    app_perror(THIS_FILE, "Unable to create master port", status);
-	    goto on_exit;
-	}
-
-	status = pjmedia_master_port_start(master_port);
-	if (status != PJ_SUCCESS) {
-	    app_perror(THIS_FILE, "Error starting master port", status);
-	    goto on_exit;
-	}
-
-	printf("Playing from WAV file %s..\n", play_file);
-        */
-
-    } else if (rec_file) {
-        /*
-
-	status = pjmedia_wav_writer_port_create(pool, rec_file,
-					        PJMEDIA_PIA_SRATE(&stream_port->info),
-					        PJMEDIA_PIA_CCNT(&stream_port->info),
-					        PJMEDIA_PIA_SPF(&stream_port->info),
-					        PJMEDIA_PIA_BITS(&stream_port->info),
-						0, 0, &rec_file_port);
-	if (status != PJ_SUCCESS) {
-	    app_perror(THIS_FILE, "Unable to use file", status);
-	    goto on_exit;
-	}
-
-	status = pjmedia_master_port_create(pool, stream_port, rec_file_port, 
-					    0, &master_port);
-	if (status != PJ_SUCCESS) {
-	    app_perror(THIS_FILE, "Unable to create master port", status);
-	    goto on_exit;
-	}
-
-	status = pjmedia_master_port_start(master_port);
-	if (status != PJ_SUCCESS) {
-	    app_perror(THIS_FILE, "Error starting master port", status);
-	    goto on_exit;
-	}
-
-	printf("Recording to WAV file %s..\n", rec_file);
-        */
-	
-    } else {
-
-        pjmedia_vid_port_param_default(&vpp);
-
-        /* Set as active for all video devices */
-        vpp.active = PJ_TRUE;
-
-	/* Create video device port. */
-        if (dir & PJMEDIA_DIR_ENCODING) {
-            /* Create capture */
-            status = pjmedia_vid_dev_default_param(pool,
-                                                   0,//PJMEDIA_VID_DEFAULT_CAPTURE_DEV,
-					           &vpp.vidparam);
-            if (status != PJ_SUCCESS)
-	        goto on_exit;
-
-            pjmedia_format_copy(&vpp.vidparam.fmt, &codec_param.dec_fmt);
-            vpp.vidparam.dir = PJMEDIA_DIR_CAPTURE;
-            
-            status = pjmedia_vid_port_create(pool, &vpp, &capture);
-            if (status != PJ_SUCCESS)
-	        goto on_exit;
-
-            status = pjmedia_vid_port_connect(capture, stream_port, PJ_FALSE);
-            if (status != PJ_SUCCESS)
-	        goto on_exit;
-        }
-	
-        if (dir & PJMEDIA_DIR_DECODING) {
-            /* Create renderer */
-            status = pjmedia_vid_dev_default_param(pool,
-                                                   1,//PJMEDIA_VID_DEFAULT_RENDER_DEV,
-					           &vpp.vidparam);
-            if (status != PJ_SUCCESS)
-	        goto on_exit;
-
-            pjmedia_format_copy(&vpp.vidparam.fmt, &codec_param.dec_fmt);
-            vpp.vidparam.dir = PJMEDIA_DIR_RENDER;
-            vpp.vidparam.disp_size = vpp.vidparam.fmt.det.vid.size;
-
-            status = pjmedia_vid_port_create(pool, &vpp, &renderer);
-            if (status != PJ_SUCCESS)
-	        goto on_exit;
-
-            status = pjmedia_vid_port_connect(renderer, stream_port, PJ_FALSE);
-            if (status != PJ_SUCCESS)
-	        goto on_exit;
-        }
-    }
-
-    /* Start streaming */
-    status = pjmedia_stream_start(stream);
-    if (status != PJ_SUCCESS)
-        goto on_exit;
-    if (renderer) {
-        status = pjmedia_vid_port_start(renderer);
-        if (status != PJ_SUCCESS)
-            goto on_exit;
-    }
-    if (capture) {
-        status = pjmedia_vid_port_start(capture);
-        if (status != PJ_SUCCESS)
-            goto on_exit;
-    }
-
-
-    /* Done */
-
-    if (dir == PJMEDIA_DIR_DECODING)
-	printf("Stream is active, dir is recv-only, local port is %d\n",
-	       local_port);
-    else if (dir == PJMEDIA_DIR_ENCODING)
-	printf("Stream is active, dir is send-only, sending to %s:%d\n",
-	       pj_inet_ntoa(remote_addr.sin_addr),
-	       pj_ntohs(remote_addr.sin_port));
-    else
-	printf("Stream is active, send/recv, local port is %d, "
-	       "sending to %s:%d\n",
-	       local_port,
-	       pj_inet_ntoa(remote_addr.sin_addr),
-	       pj_ntohs(remote_addr.sin_port));
-
-
-    for (;;) {
-
-	puts("");
-	puts("Commands:");
-	puts("  s     Display media statistics");
-	puts("  q     Quit");
-	puts("");
-
-	printf("Command: "); fflush(stdout);
-
-	if (fgets(tmp, sizeof(tmp), stdin) == NULL) {
-	    puts("EOF while reading stdin, will quit now..");
-	    break;
-	}
-
-	if (tmp[0] == 's')
-	    ;//print_stream_stat(stream, &codec_param);
-	else if (tmp[0] == 'q')
-	    break;
-
-    }
-
-
-
-    /* Start deinitialization: */
-on_exit:
-
-    /* Destroy video devices */
-    if (capture)
-	pjmedia_vid_port_destroy(capture);
-    if (renderer)
-	pjmedia_vid_port_destroy(renderer);
-
-    /* If there is master port, then we just need to destroy master port
-     * (it will recursively destroy upstream and downstream ports, which
-     * in this case are file_port and stream_port).
-     */
-    if (master_port) {
-	pjmedia_master_port_destroy(master_port, PJ_TRUE);
-	play_file_port = NULL;
-	stream = NULL;
-    }
-
-    /* Destroy stream */
-    if (stream) {
-	pjmedia_transport *tp;
-
-	tp = pjmedia_stream_get_transport(stream);
-	pjmedia_stream_destroy(stream);
-	
-	pjmedia_transport_close(tp);
-    }
-
-    /* Destroy file ports */
-    if (play_file_port)
-	pjmedia_port_destroy( play_file_port );
-    if (rec_file_port)
-	pjmedia_port_destroy( rec_file_port );
-
-    /* Shutdown video subsystem */
-    pjmedia_vid_subsys_shutdown();
-
-    /* Release application pool */
-    pj_pool_release( pool );
-
-    /* Destroy media endpoint. */
-    pjmedia_endpt_destroy( med_endpt );
-
-    /* Destroy pool factory */
-    pj_caching_pool_destroy( &cp );
-
-    /* Shutdown PJLIB */
-    pj_shutdown();
-
-
-    return (status == PJ_SUCCESS) ? 0 : 1;
-}
-
-
-
-
-static const char *good_number(char *buf, pj_int32_t val)
-{
-    if (val < 1000) {
-	pj_ansi_sprintf(buf, "%d", val);
-    } else if (val < 1000000) {
-	pj_ansi_sprintf(buf, "%d.%dK", 
-			val / 1000,
-			(val % 1000) / 100);
-    } else {
-	pj_ansi_sprintf(buf, "%d.%02dM", 
-			val / 1000000,
-			(val % 1000000) / 10000);
-    }
-
-    return buf;
-}
-
-
-#define SAMPLES_TO_USEC(usec, samples, clock_rate) \
-    do { \
-	if (samples <= 4294) \
-	    usec = samples * 1000000 / clock_rate; \
-	else { \
-	    usec = samples * 1000 / clock_rate; \
-	    usec *= 1000; \
-	} \
-    } while(0)
-
-#define PRINT_VOIP_MTC_VAL(s, v) \
-    if (v == 127) \
-	sprintf(s, "(na)"); \
-    else \
-	sprintf(s, "%d", v)
-
-
-/*
- * Print stream statistics
- */
-static void print_stream_stat(pjmedia_stream *stream,
-			      const pjmedia_codec_param *codec_param)
-{
-    char duration[80], last_update[80];
-    char bps[16], ipbps[16], packets[16], bytes[16], ipbytes[16];
-    pjmedia_port *port;
-    pjmedia_rtcp_stat stat;
-    pj_time_val now;
-
-
-    pj_gettimeofday(&now);
-    pjmedia_stream_get_stat(stream, &stat);
-    pjmedia_stream_get_port(stream, &port);
-
-    puts("Stream statistics:");
-
-    /* Print duration */
-    PJ_TIME_VAL_SUB(now, stat.start);
-    sprintf(duration, " Duration: %02ld:%02ld:%02ld.%03ld",
-	    now.sec / 3600,
-	    (now.sec % 3600) / 60,
-	    (now.sec % 60),
-	    now.msec);
-
-
-    printf(" Info: audio %dHz, %dms/frame, %sB/s (%sB/s +IP hdr)\n",
-	PJMEDIA_PIA_SRATE(&port->info),
-	PJMEDIA_PIA_PTIME(&port->info),
-	good_number(bps, (codec_param->info.avg_bps+7)/8),
-	good_number(ipbps, ((codec_param->info.avg_bps+7)/8) + 
-			   (40 * 1000 /
-			    codec_param->setting.frm_per_pkt /
-			    codec_param->info.frm_ptime)));
-
-    if (stat.rx.update_cnt == 0)
-	strcpy(last_update, "never");
-    else {
-	pj_gettimeofday(&now);
-	PJ_TIME_VAL_SUB(now, stat.rx.update);
-	sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
-		now.sec / 3600,
-		(now.sec % 3600) / 60,
-		now.sec % 60,
-		now.msec);
-    }
-
-    printf(" RX stat last update: %s\n"
-	   "    total %s packets %sB received (%sB +IP hdr)%s\n"
-	   "    pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n"
-	   "          (msec)    min     avg     max     last    dev\n"
-	   "    loss period: %7.3f %7.3f %7.3f %7.3f %7.3f%s\n"
-	   "    jitter     : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
-	   last_update,
-	   good_number(packets, stat.rx.pkt),
-	   good_number(bytes, stat.rx.bytes),
-	   good_number(ipbytes, stat.rx.bytes + stat.rx.pkt * 32),
-	   "",
-	   stat.rx.loss,
-	   stat.rx.loss * 100.0 / (stat.rx.pkt + stat.rx.loss),
-	   stat.rx.dup, 
-	   stat.rx.dup * 100.0 / (stat.rx.pkt + stat.rx.loss),
-	   stat.rx.reorder, 
-	   stat.rx.reorder * 100.0 / (stat.rx.pkt + stat.rx.loss),
-	   "",
-	   stat.rx.loss_period.min / 1000.0, 
-	   stat.rx.loss_period.mean / 1000.0, 
-	   stat.rx.loss_period.max / 1000.0,
-	   stat.rx.loss_period.last / 1000.0,
-	   pj_math_stat_get_stddev(&stat.rx.loss_period) / 1000.0,
-	   "",
-	   stat.rx.jitter.min / 1000.0,
-	   stat.rx.jitter.mean / 1000.0,
-	   stat.rx.jitter.max / 1000.0,
-	   stat.rx.jitter.last / 1000.0,
-	   pj_math_stat_get_stddev(&stat.rx.jitter) / 1000.0,
-	   ""
-	   );
-
-
-    if (stat.tx.update_cnt == 0)
-	strcpy(last_update, "never");
-    else {
-	pj_gettimeofday(&now);
-	PJ_TIME_VAL_SUB(now, stat.tx.update);
-	sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
-		now.sec / 3600,
-		(now.sec % 3600) / 60,
-		now.sec % 60,
-		now.msec);
-    }
-
-    printf(" TX stat last update: %s\n"
-	   "    total %s packets %sB sent (%sB +IP hdr)%s\n"
-	   "    pkt loss=%d (%3.1f%%), dup=%d (%3.1f%%), reorder=%d (%3.1f%%)%s\n"
-	   "          (msec)    min     avg     max     last    dev\n"
-	   "    loss period: %7.3f %7.3f %7.3f %7.3f %7.3f%s\n"
-	   "    jitter     : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n",
-	   last_update,
-	   good_number(packets, stat.tx.pkt),
-	   good_number(bytes, stat.tx.bytes),
-	   good_number(ipbytes, stat.tx.bytes + stat.tx.pkt * 32),
-	   "",
-	   stat.tx.loss,
-	   stat.tx.loss * 100.0 / (stat.tx.pkt + stat.tx.loss),
-	   stat.tx.dup, 
-	   stat.tx.dup * 100.0 / (stat.tx.pkt + stat.tx.loss),
-	   stat.tx.reorder, 
-	   stat.tx.reorder * 100.0 / (stat.tx.pkt + stat.tx.loss),
-	   "",
-	   stat.tx.loss_period.min / 1000.0, 
-	   stat.tx.loss_period.mean / 1000.0, 
-	   stat.tx.loss_period.max / 1000.0,
-	   stat.tx.loss_period.last / 1000.0,
-	   pj_math_stat_get_stddev(&stat.tx.loss_period) / 1000.0,
-	   "",
-	   stat.tx.jitter.min / 1000.0,
-	   stat.tx.jitter.mean / 1000.0,
-	   stat.tx.jitter.max / 1000.0,
-	   stat.tx.jitter.last / 1000.0,
-	   pj_math_stat_get_stddev(&stat.tx.jitter) / 1000.0,
-	   ""
-	   );
-
-
-    printf(" RTT delay     : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n", 
-	   stat.rtt.min / 1000.0,
-	   stat.rtt.mean / 1000.0,
-	   stat.rtt.max / 1000.0,
-	   stat.rtt.last / 1000.0,
-	   pj_math_stat_get_stddev(&stat.rtt) / 1000.0,
-	   ""
-	   );
-
-#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0)
-    /* RTCP XR Reports */
-    do {
-	char loss[16], dup[16];
-	char jitter[80];
-	char toh[80];
-	char plc[16], jba[16], jbr[16];
-	char signal_lvl[16], noise_lvl[16], rerl[16];
-	char r_factor[16], ext_r_factor[16], mos_lq[16], mos_cq[16];
-	pjmedia_rtcp_xr_stat xr_stat;
-
-	if (pjmedia_stream_get_stat_xr(stream, &xr_stat) != PJ_SUCCESS)
-	    break;
-
-	puts("\nExtended reports:");
-
-	/* Statistics Summary */
-	puts(" Statistics Summary");
-
-	if (xr_stat.rx.stat_sum.l)
-	    sprintf(loss, "%d", xr_stat.rx.stat_sum.lost);
-	else
-	    sprintf(loss, "(na)");
-
-	if (xr_stat.rx.stat_sum.d)
-	    sprintf(dup, "%d", xr_stat.rx.stat_sum.dup);
-	else
-	    sprintf(dup, "(na)");
-
-	if (xr_stat.rx.stat_sum.j) {
-	    unsigned jmin, jmax, jmean, jdev;
-
-	    SAMPLES_TO_USEC(jmin, xr_stat.rx.stat_sum.jitter.min, 
-			    port->info.clock_rate);
-	    SAMPLES_TO_USEC(jmax, xr_stat.rx.stat_sum.jitter.max, 
-			    port->info.clock_rate);
-	    SAMPLES_TO_USEC(jmean, xr_stat.rx.stat_sum.jitter.mean, 
-			    port->info.clock_rate);
-	    SAMPLES_TO_USEC(jdev, 
-			   pj_math_stat_get_stddev(&xr_stat.rx.stat_sum.jitter),
-			   port->info.clock_rate);
-	    sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f", 
-		    jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0);
-	} else
-	    sprintf(jitter, "(report not available)");
-
-	if (xr_stat.rx.stat_sum.t) {
-	    sprintf(toh, "%11d %11d %11d %11d", 
-		    xr_stat.rx.stat_sum.toh.min,
-		    xr_stat.rx.stat_sum.toh.mean,
-		    xr_stat.rx.stat_sum.toh.max,
-		    pj_math_stat_get_stddev(&xr_stat.rx.stat_sum.toh));
-	} else
-	    sprintf(toh, "(report not available)");
-
-	if (xr_stat.rx.stat_sum.update.sec == 0)
-	    strcpy(last_update, "never");
-	else {
-	    pj_gettimeofday(&now);
-	    PJ_TIME_VAL_SUB(now, xr_stat.rx.stat_sum.update);
-	    sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
-		    now.sec / 3600,
-		    (now.sec % 3600) / 60,
-		    now.sec % 60,
-		    now.msec);
-	}
-
-	printf(" RX last update: %s\n"
-	       "    begin seq=%d, end seq=%d%s\n"
-	       "    pkt loss=%s, dup=%s%s\n"
-	       "          (msec)    min     avg     max     dev\n"
-	       "    jitter     : %s\n"
-	       "    toh        : %s\n",
-	       last_update,
-	       xr_stat.rx.stat_sum.begin_seq, xr_stat.rx.stat_sum.end_seq,
-	       "",
-	       loss, dup,
-	       "",
-	       jitter,
-	       toh
-	       );
-
-	if (xr_stat.tx.stat_sum.l)
-	    sprintf(loss, "%d", xr_stat.tx.stat_sum.lost);
-	else
-	    sprintf(loss, "(na)");
-
-	if (xr_stat.tx.stat_sum.d)
-	    sprintf(dup, "%d", xr_stat.tx.stat_sum.dup);
-	else
-	    sprintf(dup, "(na)");
-
-	if (xr_stat.tx.stat_sum.j) {
-	    unsigned jmin, jmax, jmean, jdev;
-
-	    SAMPLES_TO_USEC(jmin, xr_stat.tx.stat_sum.jitter.min, 
-			    port->info.clock_rate);
-	    SAMPLES_TO_USEC(jmax, xr_stat.tx.stat_sum.jitter.max, 
-			    port->info.clock_rate);
-	    SAMPLES_TO_USEC(jmean, xr_stat.tx.stat_sum.jitter.mean, 
-			    port->info.clock_rate);
-	    SAMPLES_TO_USEC(jdev, 
-			   pj_math_stat_get_stddev(&xr_stat.tx.stat_sum.jitter),
-			   port->info.clock_rate);
-	    sprintf(jitter, "%7.3f %7.3f %7.3f %7.3f", 
-		    jmin/1000.0, jmean/1000.0, jmax/1000.0, jdev/1000.0);
-	} else
-	    sprintf(jitter, "(report not available)");
-
-	if (xr_stat.tx.stat_sum.t) {
-	    sprintf(toh, "%11d %11d %11d %11d", 
-		    xr_stat.tx.stat_sum.toh.min,
-		    xr_stat.tx.stat_sum.toh.mean,
-		    xr_stat.tx.stat_sum.toh.max,
-		    pj_math_stat_get_stddev(&xr_stat.rx.stat_sum.toh));
-	} else
-	    sprintf(toh,    "(report not available)");
-
-	if (xr_stat.tx.stat_sum.update.sec == 0)
-	    strcpy(last_update, "never");
-	else {
-	    pj_gettimeofday(&now);
-	    PJ_TIME_VAL_SUB(now, xr_stat.tx.stat_sum.update);
-	    sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
-		    now.sec / 3600,
-		    (now.sec % 3600) / 60,
-		    now.sec % 60,
-		    now.msec);
-	}
-
-	printf(" TX last update: %s\n"
-	       "    begin seq=%d, end seq=%d%s\n"
-	       "    pkt loss=%s, dup=%s%s\n"
-	       "          (msec)    min     avg     max     dev\n"
-	       "    jitter     : %s\n"
-	       "    toh        : %s\n",
-	       last_update,
-	       xr_stat.tx.stat_sum.begin_seq, xr_stat.tx.stat_sum.end_seq,
-	       "",
-	       loss, dup,
-	       "",
-	       jitter,
-	       toh
-	       );
-
-	/* VoIP Metrics */
-	puts(" VoIP Metrics");
-
-	PRINT_VOIP_MTC_VAL(signal_lvl, xr_stat.rx.voip_mtc.signal_lvl);
-	PRINT_VOIP_MTC_VAL(noise_lvl, xr_stat.rx.voip_mtc.noise_lvl);
-	PRINT_VOIP_MTC_VAL(rerl, xr_stat.rx.voip_mtc.rerl);
-	PRINT_VOIP_MTC_VAL(r_factor, xr_stat.rx.voip_mtc.r_factor);
-	PRINT_VOIP_MTC_VAL(ext_r_factor, xr_stat.rx.voip_mtc.ext_r_factor);
-	PRINT_VOIP_MTC_VAL(mos_lq, xr_stat.rx.voip_mtc.mos_lq);
-	PRINT_VOIP_MTC_VAL(mos_cq, xr_stat.rx.voip_mtc.mos_cq);
-
-	switch ((xr_stat.rx.voip_mtc.rx_config>>6) & 3) {
-	    case PJMEDIA_RTCP_XR_PLC_DIS:
-		sprintf(plc, "DISABLED");
-		break;
-	    case PJMEDIA_RTCP_XR_PLC_ENH:
-		sprintf(plc, "ENHANCED");
-		break;
-	    case PJMEDIA_RTCP_XR_PLC_STD:
-		sprintf(plc, "STANDARD");
-		break;
-	    case PJMEDIA_RTCP_XR_PLC_UNK:
-	    default:
-		sprintf(plc, "UNKNOWN");
-		break;
-	}
-
-	switch ((xr_stat.rx.voip_mtc.rx_config>>4) & 3) {
-	    case PJMEDIA_RTCP_XR_JB_FIXED:
-		sprintf(jba, "FIXED");
-		break;
-	    case PJMEDIA_RTCP_XR_JB_ADAPTIVE:
-		sprintf(jba, "ADAPTIVE");
-		break;
-	    default:
-		sprintf(jba, "UNKNOWN");
-		break;
-	}
-
-	sprintf(jbr, "%d", xr_stat.rx.voip_mtc.rx_config & 0x0F);
-
-	if (xr_stat.rx.voip_mtc.update.sec == 0)
-	    strcpy(last_update, "never");
-	else {
-	    pj_gettimeofday(&now);
-	    PJ_TIME_VAL_SUB(now, xr_stat.rx.voip_mtc.update);
-	    sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
-		    now.sec / 3600,
-		    (now.sec % 3600) / 60,
-		    now.sec % 60,
-		    now.msec);
-	}
-
-	printf(" RX last update: %s\n"
-	       "    packets    : loss rate=%d (%.2f%%), discard rate=%d (%.2f%%)\n"
-	       "    burst      : density=%d (%.2f%%), duration=%d%s\n"
-	       "    gap        : density=%d (%.2f%%), duration=%d%s\n"
-	       "    delay      : round trip=%d%s, end system=%d%s\n"
-	       "    level      : signal=%s%s, noise=%s%s, RERL=%s%s\n"
-	       "    quality    : R factor=%s, ext R factor=%s\n"
-	       "                 MOS LQ=%s, MOS CQ=%s\n"
-	       "    config     : PLC=%s, JB=%s, JB rate=%s, Gmin=%d\n"
-	       "    JB delay   : cur=%d%s, max=%d%s, abs max=%d%s\n",
-	       last_update,
-	       /* pakcets */
-	       xr_stat.rx.voip_mtc.loss_rate, xr_stat.rx.voip_mtc.loss_rate*100.0/256,
-	       xr_stat.rx.voip_mtc.discard_rate, xr_stat.rx.voip_mtc.discard_rate*100.0/256,
-	       /* burst */
-	       xr_stat.rx.voip_mtc.burst_den, xr_stat.rx.voip_mtc.burst_den*100.0/256,
-	       xr_stat.rx.voip_mtc.burst_dur, "ms",
-	       /* gap */
-	       xr_stat.rx.voip_mtc.gap_den, xr_stat.rx.voip_mtc.gap_den*100.0/256,
-	       xr_stat.rx.voip_mtc.gap_dur, "ms",
-	       /* delay */
-	       xr_stat.rx.voip_mtc.rnd_trip_delay, "ms",
-	       xr_stat.rx.voip_mtc.end_sys_delay, "ms",
-	       /* level */
-	       signal_lvl, "dB",
-	       noise_lvl, "dB",
-	       rerl, "",
-	       /* quality */
-	       r_factor, ext_r_factor, mos_lq, mos_cq,
-	       /* config */
-	       plc, jba, jbr, xr_stat.rx.voip_mtc.gmin,
-	       /* JB delay */
-	       xr_stat.rx.voip_mtc.jb_nom, "ms",
-	       xr_stat.rx.voip_mtc.jb_max, "ms",
-	       xr_stat.rx.voip_mtc.jb_abs_max, "ms"
-	       );
-
-	PRINT_VOIP_MTC_VAL(signal_lvl, xr_stat.tx.voip_mtc.signal_lvl);
-	PRINT_VOIP_MTC_VAL(noise_lvl, xr_stat.tx.voip_mtc.noise_lvl);
-	PRINT_VOIP_MTC_VAL(rerl, xr_stat.tx.voip_mtc.rerl);
-	PRINT_VOIP_MTC_VAL(r_factor, xr_stat.tx.voip_mtc.r_factor);
-	PRINT_VOIP_MTC_VAL(ext_r_factor, xr_stat.tx.voip_mtc.ext_r_factor);
-	PRINT_VOIP_MTC_VAL(mos_lq, xr_stat.tx.voip_mtc.mos_lq);
-	PRINT_VOIP_MTC_VAL(mos_cq, xr_stat.tx.voip_mtc.mos_cq);
-
-	switch ((xr_stat.tx.voip_mtc.rx_config>>6) & 3) {
-	    case PJMEDIA_RTCP_XR_PLC_DIS:
-		sprintf(plc, "DISABLED");
-		break;
-	    case PJMEDIA_RTCP_XR_PLC_ENH:
-		sprintf(plc, "ENHANCED");
-		break;
-	    case PJMEDIA_RTCP_XR_PLC_STD:
-		sprintf(plc, "STANDARD");
-		break;
-	    case PJMEDIA_RTCP_XR_PLC_UNK:
-	    default:
-		sprintf(plc, "unknown");
-		break;
-	}
-
-	switch ((xr_stat.tx.voip_mtc.rx_config>>4) & 3) {
-	    case PJMEDIA_RTCP_XR_JB_FIXED:
-		sprintf(jba, "FIXED");
-		break;
-	    case PJMEDIA_RTCP_XR_JB_ADAPTIVE:
-		sprintf(jba, "ADAPTIVE");
-		break;
-	    default:
-		sprintf(jba, "unknown");
-		break;
-	}
-
-	sprintf(jbr, "%d", xr_stat.tx.voip_mtc.rx_config & 0x0F);
-
-	if (xr_stat.tx.voip_mtc.update.sec == 0)
-	    strcpy(last_update, "never");
-	else {
-	    pj_gettimeofday(&now);
-	    PJ_TIME_VAL_SUB(now, xr_stat.tx.voip_mtc.update);
-	    sprintf(last_update, "%02ldh:%02ldm:%02ld.%03lds ago",
-		    now.sec / 3600,
-		    (now.sec % 3600) / 60,
-		    now.sec % 60,
-		    now.msec);
-	}
-
-	printf(" TX last update: %s\n"
-	       "    packets    : loss rate=%d (%.2f%%), discard rate=%d (%.2f%%)\n"
-	       "    burst      : density=%d (%.2f%%), duration=%d%s\n"
-	       "    gap        : density=%d (%.2f%%), duration=%d%s\n"
-	       "    delay      : round trip=%d%s, end system=%d%s\n"
-	       "    level      : signal=%s%s, noise=%s%s, RERL=%s%s\n"
-	       "    quality    : R factor=%s, ext R factor=%s\n"
-	       "                 MOS LQ=%s, MOS CQ=%s\n"
-	       "    config     : PLC=%s, JB=%s, JB rate=%s, Gmin=%d\n"
-	       "    JB delay   : cur=%d%s, max=%d%s, abs max=%d%s\n",
-	       last_update,
-	       /* pakcets */
-	       xr_stat.tx.voip_mtc.loss_rate, xr_stat.tx.voip_mtc.loss_rate*100.0/256,
-	       xr_stat.tx.voip_mtc.discard_rate, xr_stat.tx.voip_mtc.discard_rate*100.0/256,
-	       /* burst */
-	       xr_stat.tx.voip_mtc.burst_den, xr_stat.tx.voip_mtc.burst_den*100.0/256,
-	       xr_stat.tx.voip_mtc.burst_dur, "ms",
-	       /* gap */
-	       xr_stat.tx.voip_mtc.gap_den, xr_stat.tx.voip_mtc.gap_den*100.0/256,
-	       xr_stat.tx.voip_mtc.gap_dur, "ms",
-	       /* delay */
-	       xr_stat.tx.voip_mtc.rnd_trip_delay, "ms",
-	       xr_stat.tx.voip_mtc.end_sys_delay, "ms",
-	       /* level */
-	       signal_lvl, "dB",
-	       noise_lvl, "dB",
-	       rerl, "",
-	       /* quality */
-	       r_factor, ext_r_factor, mos_lq, mos_cq,
-	       /* config */
-	       plc, jba, jbr, xr_stat.tx.voip_mtc.gmin,
-	       /* JB delay */
-	       xr_stat.tx.voip_mtc.jb_nom, "ms",
-	       xr_stat.tx.voip_mtc.jb_max, "ms",
-	       xr_stat.tx.voip_mtc.jb_abs_max, "ms"
-	       );
-
-
-	/* RTT delay (by receiver side) */
-	printf("          (msec)    min     avg     max     last    dev\n");
-	printf(" RTT delay     : %7.3f %7.3f %7.3f %7.3f %7.3f%s\n", 
-	       xr_stat.rtt.min / 1000.0,
-	       xr_stat.rtt.mean / 1000.0,
-	       xr_stat.rtt.max / 1000.0,
-	       xr_stat.rtt.last / 1000.0,
-	       pj_math_stat_get_stddev(&xr_stat.rtt) / 1000.0,
-	       ""
-	       );
-    } while (0);
-#endif /* PJMEDIA_HAS_RTCP_XR */
-
-}
-