blob: 588712a94cfb2d80079c33d6680b50c3a9ed8fbf [file] [log] [blame]
/*
* Copyright (c) 2012 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.
*/
#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:
// When |runtime_cpu_detection| is true, runtime selection of an optimized
// code path is allowed.
VPMContentAnalysis(bool runtime_cpu_detection);
~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_ARCH_X86_FAMILY)
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 _motionMagnitude; // motion class
float _spatialPredErr; // spatial class
float _spatialPredErrH; // spatial class
float _spatialPredErrV; // spatial class
bool _firstFrame;
bool _CAInit;
VideoContentMetrics* _cMetrics;
}; // end of VPMContentAnalysis class definition
} // namespace
#endif