From b3c8747f3a59f1b602c0d12ae2131ccd654be7b0 Mon Sep 17 00:00:00 2001
From: Julien Michel <julien.michel@cnes.fr>
Date: Tue, 10 Nov 2015 15:56:20 +0100
Subject: [PATCH] PERF: Move CovarianceEstimator updates out of
 BeforeThreadedGenerateData

---
 .../include/otbNormalizeVectorImageFilter.h   |  1 +
 .../include/otbNormalizeVectorImageFilter.txx | 19 ++++++++++++++++---
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.h b/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.h
index 9a2923f7e2..56ec38934f 100644
--- a/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.h
+++ b/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.h
@@ -195,6 +195,7 @@ protected:
   NormalizeVectorImageFilter ();
   virtual ~NormalizeVectorImageFilter() { }
 
+  void GenerateOutputInformation();
   void BeforeThreadedGenerateData();
 
 private:
diff --git a/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.txx b/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.txx
index ba395638cd..c91a9df6bf 100644
--- a/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.txx
+++ b/Modules/Filtering/Statistics/include/otbNormalizeVectorImageFilter.txx
@@ -35,6 +35,22 @@ NormalizeVectorImageFilter< TInputImage, TOutputImage >
   m_CovarianceEstimator = CovarianceEstimatorFilterType::New();
 }
 
+
+template < class TInputImage, class TOutputImage >
+void
+NormalizeVectorImageFilter< TInputImage, TOutputImage >
+::GenerateOutputInformation()
+{
+  // Call superclass implementation
+  Superclass::GenerateOutputInformation();
+
+  if( (m_UseMean && !m_IsGivenMean) || (m_UseStdDev && !m_IsGivenStdDev))
+    {
+    m_CovarianceEstimator->SetInput( const_cast<InputImageType*>( this->GetInput() ) );
+    m_CovarianceEstimator->Update();
+    }  
+}
+
 template < class TInputImage, class TOutputImage >
 void
 NormalizeVectorImageFilter< TInputImage, TOutputImage >
@@ -56,9 +72,6 @@ NormalizeVectorImageFilter< TInputImage, TOutputImage >
 
   if ( !m_IsGivenMean )
   {
-    m_CovarianceEstimator->SetInput( const_cast<InputImageType*>( this->GetInput() ) );
-    m_CovarianceEstimator->Update();
-
     this->GetFunctor().SetMean( m_CovarianceEstimator->GetMean() );
 
     if ( !m_IsGivenStdDev && m_UseStdDev )
-- 
GitLab