/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

/*
 * content_analysis.h
 */

#ifndef VPM_CONTENT_ANALYSIS_H
#define VPM_CONTENT_ANALYSIS_H

#include "typedefs.h"
#include "module_common_types.h"
#include "video_processing_defines.h"

namespace webrtc {

class VPMContentAnalysis
{
public:
    VPMContentAnalysis(bool RTCD = true);
    ~VPMContentAnalysis();

    // Initialize ContentAnalysis - should be called prior to
    //  extractContentFeature
    // Inputs:         width, height
    // Return value:   0 if OK, negative value upon error
    WebRtc_Word32 Initialize(WebRtc_UWord16 width, WebRtc_UWord16 height);

    // Extract content Feature - main function of ContentAnalysis
    // Input:           new frame
    // Return value:    pointer to structure containing content Analysis
    //                  metrics or NULL value upon error
    VideoContentMetrics* ComputeContentMetrics(const VideoFrame* inputFrame);

    // Release all allocated memory
    // Output: 0 if OK, negative value upon error
    WebRtc_Word32 Release();

private:

    // return motion metrics
    VideoContentMetrics* ContentMetrics();

    // Normalized temporal difference metric: for motion magnitude
    typedef WebRtc_Word32 (VPMContentAnalysis::*TemporalDiffMetricFunc)();
    TemporalDiffMetricFunc TemporalDiffMetric;
    WebRtc_Word32 TemporalDiffMetric_C();

    // Motion metric method: call 2 metrics (magnitude and size)
    WebRtc_Word32 ComputeMotionMetrics();

    // Spatial metric method: computes the 3 frame-average spatial
    //  prediction errors (1x2,2x1,2x2)
    typedef WebRtc_Word32 (VPMContentAnalysis::*ComputeSpatialMetricsFunc)();
    ComputeSpatialMetricsFunc ComputeSpatialMetrics;
    WebRtc_Word32 ComputeSpatialMetrics_C();

#if defined(WEBRTC_USE_SSE2)
    WebRtc_Word32 ComputeSpatialMetrics_SSE2();
    WebRtc_Word32 TemporalDiffMetric_SSE2();
#endif

    const WebRtc_UWord8*       _origFrame;
    WebRtc_UWord8*             _prevFrame;
    WebRtc_UWord16             _width;
    WebRtc_UWord16             _height;
    WebRtc_UWord32             _skipNum;
    WebRtc_Word32              _border;

    // Content Metrics:
    // stores the local average of the metrics
    float                  _motionMagnitudeNZ;  // motion class
    float                  _spatialPredErr;     // spatial class
    float                  _spatialPredErrH;    // spatial class
    float                  _spatialPredErrV;    // spatial class
    float                  _sizeZeroMotion;     // motion class
    float                  _motionPredErr;      // complexity class:
    float                  _motionHorizontalness;     // coherence class
    float                  _motionClusterDistortion;  // coherence class

    bool                   _firstFrame;
    bool                   _CAInit;

    VideoContentMetrics*   _cMetrics;

}; // end of VPMContentAnalysis class definition

} // namespace

#endif
