diff options
Diffstat (limited to 'webrtc/modules/video_processing/main/source')
18 files changed, 0 insertions, 2160 deletions
diff --git a/webrtc/modules/video_processing/main/source/OWNERS b/webrtc/modules/video_processing/main/source/OWNERS deleted file mode 100644 index 3ee6b4bf5f..0000000000 --- a/webrtc/modules/video_processing/main/source/OWNERS +++ /dev/null @@ -1,5 +0,0 @@ - -# These are for the common case of adding or renaming files. If you're doing -# structural changes, please get a review from a reviewer in this file. -per-file *.gyp=* -per-file *.gypi=* diff --git a/webrtc/modules/video_processing/main/source/brighten.cc b/webrtc/modules/video_processing/main/source/brighten.cc deleted file mode 100644 index 1fe813e7b0..0000000000 --- a/webrtc/modules/video_processing/main/source/brighten.cc +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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. - */ - -#include "webrtc/modules/video_processing/main/source/brighten.h" - -#include <stdlib.h> - -namespace webrtc { -namespace VideoProcessing { - -int32_t Brighten(VideoFrame* frame, int delta) { - assert(frame); - if (frame->IsZeroSize()) { - return VPM_PARAMETER_ERROR; - } - if (frame->width() <= 0 || frame->height() <= 0) { - return VPM_PARAMETER_ERROR; - } - - int num_pixels = frame->width() * frame->height(); - - int look_up[256]; - for (int i = 0; i < 256; i++) { - int val = i + delta; - look_up[i] = ((((val < 0) ? 0 : val) > 255) ? 255 : val); - } - - uint8_t* temp_ptr = frame->buffer(kYPlane); - - for (int i = 0; i < num_pixels; i++) { - *temp_ptr = static_cast<uint8_t>(look_up[*temp_ptr]); - temp_ptr++; - } - return VPM_OK; -} - -} // namespace VideoProcessing -} // namespace webrtc diff --git a/webrtc/modules/video_processing/main/source/brighten.h b/webrtc/modules/video_processing/main/source/brighten.h deleted file mode 100644 index 151d7a3b51..0000000000 --- a/webrtc/modules/video_processing/main/source/brighten.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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. - */ - -#ifndef MODULES_VIDEO_PROCESSING_MAIN_SOURCE_BRIGHTEN_H_ -#define MODULES_VIDEO_PROCESSING_MAIN_SOURCE_BRIGHTEN_H_ - -#include "webrtc/modules/video_processing/main/interface/video_processing.h" -#include "webrtc/typedefs.h" - -namespace webrtc { -namespace VideoProcessing { - -int32_t Brighten(VideoFrame* frame, int delta); - -} // namespace VideoProcessing -} // namespace webrtc - -#endif // MODULES_VIDEO_PROCESSING_MAIN_SOURCE_BRIGHTEN_H_ diff --git a/webrtc/modules/video_processing/main/source/brightness_detection.cc b/webrtc/modules/video_processing/main/source/brightness_detection.cc deleted file mode 100644 index bae225b3b0..0000000000 --- a/webrtc/modules/video_processing/main/source/brightness_detection.cc +++ /dev/null @@ -1,133 +0,0 @@ -/* - * 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. - */ - -#include "webrtc/modules/video_processing/main/interface/video_processing.h" -#include "webrtc/modules/video_processing/main/source/brightness_detection.h" - -#include <math.h> - -namespace webrtc { - -VPMBrightnessDetection::VPMBrightnessDetection() { - Reset(); -} - -VPMBrightnessDetection::~VPMBrightnessDetection() {} - -void VPMBrightnessDetection::Reset() { - frame_cnt_bright_ = 0; - frame_cnt_dark_ = 0; -} - -int32_t VPMBrightnessDetection::ProcessFrame( - const VideoFrame& frame, - const VideoProcessingModule::FrameStats& stats) { - if (frame.IsZeroSize()) { - return VPM_PARAMETER_ERROR; - } - int width = frame.width(); - int height = frame.height(); - - if (!VideoProcessingModule::ValidFrameStats(stats)) { - return VPM_PARAMETER_ERROR; - } - - const uint8_t frame_cnt_alarm = 2; - - // Get proportion in lowest bins. - uint8_t low_th = 20; - float prop_low = 0; - for (uint32_t i = 0; i < low_th; i++) { - prop_low += stats.hist[i]; - } - prop_low /= stats.num_pixels; - - // Get proportion in highest bins. - unsigned char high_th = 230; - float prop_high = 0; - for (uint32_t i = high_th; i < 256; i++) { - prop_high += stats.hist[i]; - } - prop_high /= stats.num_pixels; - - if (prop_high < 0.4) { - if (stats.mean < 90 || stats.mean > 170) { - // Standard deviation of Y - const uint8_t* buffer = frame.buffer(kYPlane); - float std_y = 0; - for (int h = 0; h < height; h += (1 << stats.subSamplHeight)) { - int row = h*width; - for (int w = 0; w < width; w += (1 << stats.subSamplWidth)) { - std_y += (buffer[w + row] - stats.mean) * (buffer[w + row] - - stats.mean); - } - } - std_y = sqrt(std_y / stats.num_pixels); - - // Get percentiles. - uint32_t sum = 0; - uint32_t median_y = 140; - uint32_t perc05 = 0; - uint32_t perc95 = 255; - float pos_perc05 = stats.num_pixels * 0.05f; - float pos_median = stats.num_pixels * 0.5f; - float posPerc95 = stats.num_pixels * 0.95f; - for (uint32_t i = 0; i < 256; i++) { - sum += stats.hist[i]; - if (sum < pos_perc05) perc05 = i; // 5th perc. - if (sum < pos_median) median_y = i; // 50th perc. - if (sum < posPerc95) - perc95 = i; // 95th perc. - else - break; - } - - // Check if image is too dark - if ((std_y < 55) && (perc05 < 50)) { - if (median_y < 60 || stats.mean < 80 || perc95 < 130 || - prop_low > 0.20) { - frame_cnt_dark_++; - } else { - frame_cnt_dark_ = 0; - } - } else { - frame_cnt_dark_ = 0; - } - - // Check if image is too bright - if ((std_y < 52) && (perc95 > 200) && (median_y > 160)) { - if (median_y > 185 || stats.mean > 185 || perc05 > 140 || - prop_high > 0.25) { - frame_cnt_bright_++; - } else { - frame_cnt_bright_ = 0; - } - } else { - frame_cnt_bright_ = 0; - } - } else { - frame_cnt_dark_ = 0; - frame_cnt_bright_ = 0; - } - } else { - frame_cnt_bright_++; - frame_cnt_dark_ = 0; - } - - if (frame_cnt_dark_ > frame_cnt_alarm) { - return VideoProcessingModule::kDarkWarning; - } else if (frame_cnt_bright_ > frame_cnt_alarm) { - return VideoProcessingModule::kBrightWarning; - } else { - return VideoProcessingModule::kNoWarning; - } -} - -} // namespace webrtc diff --git a/webrtc/modules/video_processing/main/source/brightness_detection.h b/webrtc/modules/video_processing/main/source/brightness_detection.h deleted file mode 100644 index 48532b4a20..0000000000 --- a/webrtc/modules/video_processing/main/source/brightness_detection.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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. - */ - -/* - * brightness_detection.h - */ -#ifndef MODULES_VIDEO_PROCESSING_MAIN_SOURCE_BRIGHTNESS_DETECTION_H -#define MODULES_VIDEO_PROCESSING_MAIN_SOURCE_BRIGHTNESS_DETECTION_H -#include "webrtc/modules/video_processing/main/interface/video_processing.h" -#include "webrtc/typedefs.h" - -namespace webrtc { - -class VPMBrightnessDetection { - public: - VPMBrightnessDetection(); - ~VPMBrightnessDetection(); - - void Reset(); - int32_t ProcessFrame(const VideoFrame& frame, - const VideoProcessingModule::FrameStats& stats); - - private: - uint32_t frame_cnt_bright_; - uint32_t frame_cnt_dark_; -}; - -} // namespace webrtc - -#endif // MODULES_VIDEO_PROCESSING_MAIN_SOURCE_BRIGHTNESS_DETECTION_H diff --git a/webrtc/modules/video_processing/main/source/content_analysis.cc b/webrtc/modules/video_processing/main/source/content_analysis.cc deleted file mode 100644 index d29db27408..0000000000 --- a/webrtc/modules/video_processing/main/source/content_analysis.cc +++ /dev/null @@ -1,274 +0,0 @@ -/* - * 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. - */ -#include "webrtc/modules/video_processing/main/source/content_analysis.h" - -#include <math.h> -#include <stdlib.h> - -#include "webrtc/system_wrappers/include/cpu_features_wrapper.h" -#include "webrtc/system_wrappers/include/tick_util.h" - -namespace webrtc { - -VPMContentAnalysis::VPMContentAnalysis(bool runtime_cpu_detection) - : orig_frame_(NULL), - prev_frame_(NULL), - width_(0), - height_(0), - skip_num_(1), - border_(8), - motion_magnitude_(0.0f), - spatial_pred_err_(0.0f), - spatial_pred_err_h_(0.0f), - spatial_pred_err_v_(0.0f), - first_frame_(true), - ca_Init_(false), - content_metrics_(NULL) { - ComputeSpatialMetrics = &VPMContentAnalysis::ComputeSpatialMetrics_C; - TemporalDiffMetric = &VPMContentAnalysis::TemporalDiffMetric_C; - - if (runtime_cpu_detection) { -#if defined(WEBRTC_ARCH_X86_FAMILY) - if (WebRtc_GetCPUInfo(kSSE2)) { - ComputeSpatialMetrics = &VPMContentAnalysis::ComputeSpatialMetrics_SSE2; - TemporalDiffMetric = &VPMContentAnalysis::TemporalDiffMetric_SSE2; - } -#endif - } - Release(); -} - -VPMContentAnalysis::~VPMContentAnalysis() { - Release(); -} - -VideoContentMetrics* VPMContentAnalysis::ComputeContentMetrics( - const VideoFrame& inputFrame) { - if (inputFrame.IsZeroSize()) - return NULL; - - // Init if needed (native dimension change). - if (width_ != inputFrame.width() || height_ != inputFrame.height()) { - if (VPM_OK != Initialize(inputFrame.width(), inputFrame.height())) - return NULL; - } - // Only interested in the Y plane. - orig_frame_ = inputFrame.buffer(kYPlane); - - // Compute spatial metrics: 3 spatial prediction errors. - (this->*ComputeSpatialMetrics)(); - - // Compute motion metrics - if (first_frame_ == false) - ComputeMotionMetrics(); - - // Saving current frame as previous one: Y only. - memcpy(prev_frame_, orig_frame_, width_ * height_); - - first_frame_ = false; - ca_Init_ = true; - - return ContentMetrics(); -} - -int32_t VPMContentAnalysis::Release() { - if (content_metrics_ != NULL) { - delete content_metrics_; - content_metrics_ = NULL; - } - - if (prev_frame_ != NULL) { - delete [] prev_frame_; - prev_frame_ = NULL; - } - - width_ = 0; - height_ = 0; - first_frame_ = true; - - return VPM_OK; -} - -int32_t VPMContentAnalysis::Initialize(int width, int height) { - width_ = width; - height_ = height; - first_frame_ = true; - - // skip parameter: # of skipped rows: for complexity reduction - // temporal also currently uses it for column reduction. - skip_num_ = 1; - - // use skipNum = 2 for 4CIF, WHD - if ( (height_ >= 576) && (width_ >= 704) ) { - skip_num_ = 2; - } - // use skipNum = 4 for FULLL_HD images - if ( (height_ >= 1080) && (width_ >= 1920) ) { - skip_num_ = 4; - } - - if (content_metrics_ != NULL) { - delete content_metrics_; - } - - if (prev_frame_ != NULL) { - delete [] prev_frame_; - } - - // Spatial Metrics don't work on a border of 8. Minimum processing - // block size is 16 pixels. So make sure the width and height support this. - if (width_ <= 32 || height_ <= 32) { - ca_Init_ = false; - return VPM_PARAMETER_ERROR; - } - - content_metrics_ = new VideoContentMetrics(); - if (content_metrics_ == NULL) { - return VPM_MEMORY; - } - - prev_frame_ = new uint8_t[width_ * height_]; // Y only. - if (prev_frame_ == NULL) return VPM_MEMORY; - - return VPM_OK; -} - - -// Compute motion metrics: magnitude over non-zero motion vectors, -// and size of zero cluster -int32_t VPMContentAnalysis::ComputeMotionMetrics() { - // Motion metrics: only one is derived from normalized - // (MAD) temporal difference - (this->*TemporalDiffMetric)(); - return VPM_OK; -} - -// Normalized temporal difference (MAD): used as a motion level metric -// Normalize MAD by spatial contrast: images with more contrast -// (pixel variance) likely have larger temporal difference -// To reduce complexity, we compute the metric for a reduced set of points. -int32_t VPMContentAnalysis::TemporalDiffMetric_C() { - // size of original frame - int sizei = height_; - int sizej = width_; - uint32_t tempDiffSum = 0; - uint32_t pixelSum = 0; - uint64_t pixelSqSum = 0; - - uint32_t num_pixels = 0; // Counter for # of pixels. - const int width_end = ((width_ - 2*border_) & -16) + border_; - - for (int i = border_; i < sizei - border_; i += skip_num_) { - for (int j = border_; j < width_end; j++) { - num_pixels += 1; - int ssn = i * sizej + j; - - uint8_t currPixel = orig_frame_[ssn]; - uint8_t prevPixel = prev_frame_[ssn]; - - tempDiffSum += (uint32_t)abs((int16_t)(currPixel - prevPixel)); - pixelSum += (uint32_t) currPixel; - pixelSqSum += (uint64_t) (currPixel * currPixel); - } - } - - // Default. - motion_magnitude_ = 0.0f; - - if (tempDiffSum == 0) return VPM_OK; - - // Normalize over all pixels. - float const tempDiffAvg = (float)tempDiffSum / (float)(num_pixels); - float const pixelSumAvg = (float)pixelSum / (float)(num_pixels); - float const pixelSqSumAvg = (float)pixelSqSum / (float)(num_pixels); - float contrast = pixelSqSumAvg - (pixelSumAvg * pixelSumAvg); - - if (contrast > 0.0) { - contrast = sqrt(contrast); - motion_magnitude_ = tempDiffAvg/contrast; - } - return VPM_OK; -} - -// Compute spatial metrics: -// To reduce complexity, we compute the metric for a reduced set of points. -// The spatial metrics are rough estimates of the prediction error cost for -// each QM spatial mode: 2x2,1x2,2x1 -// The metrics are a simple estimate of the up-sampling prediction error, -// estimated assuming sub-sampling for decimation (no filtering), -// and up-sampling back up with simple bilinear interpolation. -int32_t VPMContentAnalysis::ComputeSpatialMetrics_C() { - const int sizei = height_; - const int sizej = width_; - - // Pixel mean square average: used to normalize the spatial metrics. - uint32_t pixelMSA = 0; - - uint32_t spatialErrSum = 0; - uint32_t spatialErrVSum = 0; - uint32_t spatialErrHSum = 0; - - // make sure work section is a multiple of 16 - const int width_end = ((sizej - 2*border_) & -16) + border_; - - for (int i = border_; i < sizei - border_; i += skip_num_) { - for (int j = border_; j < width_end; j++) { - int ssn1= i * sizej + j; - int ssn2 = (i + 1) * sizej + j; // bottom - int ssn3 = (i - 1) * sizej + j; // top - int ssn4 = i * sizej + j + 1; // right - int ssn5 = i * sizej + j - 1; // left - - uint16_t refPixel1 = orig_frame_[ssn1] << 1; - uint16_t refPixel2 = orig_frame_[ssn1] << 2; - - uint8_t bottPixel = orig_frame_[ssn2]; - uint8_t topPixel = orig_frame_[ssn3]; - uint8_t rightPixel = orig_frame_[ssn4]; - uint8_t leftPixel = orig_frame_[ssn5]; - - spatialErrSum += (uint32_t) abs((int16_t)(refPixel2 - - (uint16_t)(bottPixel + topPixel + leftPixel + rightPixel))); - spatialErrVSum += (uint32_t) abs((int16_t)(refPixel1 - - (uint16_t)(bottPixel + topPixel))); - spatialErrHSum += (uint32_t) abs((int16_t)(refPixel1 - - (uint16_t)(leftPixel + rightPixel))); - pixelMSA += orig_frame_[ssn1]; - } - } - - // Normalize over all pixels. - const float spatialErr = (float)(spatialErrSum >> 2); - const float spatialErrH = (float)(spatialErrHSum >> 1); - const float spatialErrV = (float)(spatialErrVSum >> 1); - const float norm = (float)pixelMSA; - - // 2X2: - spatial_pred_err_ = spatialErr / norm; - // 1X2: - spatial_pred_err_h_ = spatialErrH / norm; - // 2X1: - spatial_pred_err_v_ = spatialErrV / norm; - return VPM_OK; -} - -VideoContentMetrics* VPMContentAnalysis::ContentMetrics() { - if (ca_Init_ == false) return NULL; - - content_metrics_->spatial_pred_err = spatial_pred_err_; - content_metrics_->spatial_pred_err_h = spatial_pred_err_h_; - content_metrics_->spatial_pred_err_v = spatial_pred_err_v_; - // Motion metric: normalized temporal difference (MAD). - content_metrics_->motion_magnitude = motion_magnitude_; - - return content_metrics_; -} - -} // namespace webrtc diff --git a/webrtc/modules/video_processing/main/source/content_analysis.h b/webrtc/modules/video_processing/main/source/content_analysis.h deleted file mode 100644 index 510c1b4a55..0000000000 --- a/webrtc/modules/video_processing/main/source/content_analysis.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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 WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_CONTENT_ANALYSIS_H -#define WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_CONTENT_ANALYSIS_H - -#include "webrtc/modules/interface/module_common_types.h" -#include "webrtc/modules/video_processing/main/interface/video_processing_defines.h" -#include "webrtc/typedefs.h" -#include "webrtc/video_frame.h" - -namespace webrtc { - -class VPMContentAnalysis { - public: - // When |runtime_cpu_detection| is true, runtime selection of an optimized - // code path is allowed. - explicit 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 - int32_t Initialize(int width, int 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 - int32_t Release(); - - private: - // return motion metrics - VideoContentMetrics* ContentMetrics(); - - // Normalized temporal difference metric: for motion magnitude - typedef int32_t (VPMContentAnalysis::*TemporalDiffMetricFunc)(); - TemporalDiffMetricFunc TemporalDiffMetric; - int32_t TemporalDiffMetric_C(); - - // Motion metric method: call 2 metrics (magnitude and size) - int32_t ComputeMotionMetrics(); - - // Spatial metric method: computes the 3 frame-average spatial - // prediction errors (1x2,2x1,2x2) - typedef int32_t (VPMContentAnalysis::*ComputeSpatialMetricsFunc)(); - ComputeSpatialMetricsFunc ComputeSpatialMetrics; - int32_t ComputeSpatialMetrics_C(); - -#if defined(WEBRTC_ARCH_X86_FAMILY) - int32_t ComputeSpatialMetrics_SSE2(); - int32_t TemporalDiffMetric_SSE2(); -#endif - - const uint8_t* orig_frame_; - uint8_t* prev_frame_; - int width_; - int height_; - int skip_num_; - int border_; - - // Content Metrics: Stores the local average of the metrics. - float motion_magnitude_; // motion class - float spatial_pred_err_; // spatial class - float spatial_pred_err_h_; // spatial class - float spatial_pred_err_v_; // spatial class - bool first_frame_; - bool ca_Init_; - - VideoContentMetrics* content_metrics_; -}; - -} // namespace webrtc - -#endif // WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_CONTENT_ANALYSIS_H diff --git a/webrtc/modules/video_processing/main/source/content_analysis_sse2.cc b/webrtc/modules/video_processing/main/source/content_analysis_sse2.cc deleted file mode 100644 index 17b64ff280..0000000000 --- a/webrtc/modules/video_processing/main/source/content_analysis_sse2.cc +++ /dev/null @@ -1,264 +0,0 @@ -/* - * 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. - */ - -#include "webrtc/modules/video_processing/main/source/content_analysis.h" - -#include <emmintrin.h> -#include <math.h> - -namespace webrtc { - -int32_t VPMContentAnalysis::TemporalDiffMetric_SSE2() { - uint32_t num_pixels = 0; // counter for # of pixels - const uint8_t* imgBufO = orig_frame_ + border_*width_ + border_; - const uint8_t* imgBufP = prev_frame_ + border_*width_ + border_; - - const int32_t width_end = ((width_ - 2*border_) & -16) + border_; - - __m128i sad_64 = _mm_setzero_si128(); - __m128i sum_64 = _mm_setzero_si128(); - __m128i sqsum_64 = _mm_setzero_si128(); - const __m128i z = _mm_setzero_si128(); - - for (uint16_t i = 0; i < (height_ - 2*border_); i += skip_num_) { - __m128i sqsum_32 = _mm_setzero_si128(); - - const uint8_t *lineO = imgBufO; - const uint8_t *lineP = imgBufP; - - // Work on 16 pixels at a time. For HD content with a width of 1920 - // this loop will run ~67 times (depending on border). Maximum for - // abs(o-p) and sum(o) will be 255. _mm_sad_epu8 produces 2 64 bit - // results which are then accumulated. There is no chance of - // rollover for these two accumulators. - // o*o will have a maximum of 255*255 = 65025. This will roll over - // a 16 bit accumulator as 67*65025 > 65535, but will fit in a - // 32 bit accumulator. - for (uint16_t j = 0; j < width_end - border_; j += 16) { - const __m128i o = _mm_loadu_si128((__m128i*)(lineO)); - const __m128i p = _mm_loadu_si128((__m128i*)(lineP)); - - lineO += 16; - lineP += 16; - - // Abs pixel difference between frames. - sad_64 = _mm_add_epi64 (sad_64, _mm_sad_epu8(o, p)); - - // sum of all pixels in frame - sum_64 = _mm_add_epi64 (sum_64, _mm_sad_epu8(o, z)); - - // Squared sum of all pixels in frame. - const __m128i olo = _mm_unpacklo_epi8(o,z); - const __m128i ohi = _mm_unpackhi_epi8(o,z); - - const __m128i sqsum_32_lo = _mm_madd_epi16(olo, olo); - const __m128i sqsum_32_hi = _mm_madd_epi16(ohi, ohi); - - sqsum_32 = _mm_add_epi32(sqsum_32, sqsum_32_lo); - sqsum_32 = _mm_add_epi32(sqsum_32, sqsum_32_hi); - } - - // Add to 64 bit running sum as to not roll over. - sqsum_64 = _mm_add_epi64(sqsum_64, - _mm_add_epi64(_mm_unpackhi_epi32(sqsum_32,z), - _mm_unpacklo_epi32(sqsum_32,z))); - - imgBufO += width_ * skip_num_; - imgBufP += width_ * skip_num_; - num_pixels += (width_end - border_); - } - - __m128i sad_final_128; - __m128i sum_final_128; - __m128i sqsum_final_128; - - // Bring sums out of vector registers and into integer register - // domain, summing them along the way. - _mm_store_si128 (&sad_final_128, sad_64); - _mm_store_si128 (&sum_final_128, sum_64); - _mm_store_si128 (&sqsum_final_128, sqsum_64); - - uint64_t *sad_final_64 = reinterpret_cast<uint64_t*>(&sad_final_128); - uint64_t *sum_final_64 = reinterpret_cast<uint64_t*>(&sum_final_128); - uint64_t *sqsum_final_64 = reinterpret_cast<uint64_t*>(&sqsum_final_128); - - const uint32_t pixelSum = sum_final_64[0] + sum_final_64[1]; - const uint64_t pixelSqSum = sqsum_final_64[0] + sqsum_final_64[1]; - const uint32_t tempDiffSum = sad_final_64[0] + sad_final_64[1]; - - // Default. - motion_magnitude_ = 0.0f; - - if (tempDiffSum == 0) return VPM_OK; - - // Normalize over all pixels. - const float tempDiffAvg = (float)tempDiffSum / (float)(num_pixels); - const float pixelSumAvg = (float)pixelSum / (float)(num_pixels); - const float pixelSqSumAvg = (float)pixelSqSum / (float)(num_pixels); - float contrast = pixelSqSumAvg - (pixelSumAvg * pixelSumAvg); - - if (contrast > 0.0) { - contrast = sqrt(contrast); - motion_magnitude_ = tempDiffAvg/contrast; - } - - return VPM_OK; -} - -int32_t VPMContentAnalysis::ComputeSpatialMetrics_SSE2() { - const uint8_t* imgBuf = orig_frame_ + border_*width_; - const int32_t width_end = ((width_ - 2 * border_) & -16) + border_; - - __m128i se_32 = _mm_setzero_si128(); - __m128i sev_32 = _mm_setzero_si128(); - __m128i seh_32 = _mm_setzero_si128(); - __m128i msa_32 = _mm_setzero_si128(); - const __m128i z = _mm_setzero_si128(); - - // Error is accumulated as a 32 bit value. Looking at HD content with a - // height of 1080 lines, or about 67 macro blocks. If the 16 bit row - // value is maxed out at 65529 for every row, 65529*1080 = 70777800, which - // will not roll over a 32 bit accumulator. - // skip_num_ is also used to reduce the number of rows - for (int32_t i = 0; i < (height_ - 2*border_); i += skip_num_) { - __m128i se_16 = _mm_setzero_si128(); - __m128i sev_16 = _mm_setzero_si128(); - __m128i seh_16 = _mm_setzero_si128(); - __m128i msa_16 = _mm_setzero_si128(); - - // Row error is accumulated as a 16 bit value. There are 8 - // accumulators. Max value of a 16 bit number is 65529. Looking - // at HD content, 1080p, has a width of 1920, 120 macro blocks. - // A mb at a time is processed at a time. Absolute max error at - // a point would be abs(0-255+255+255+255) which equals 1020. - // 120*1020 = 122400. The probability of hitting this is quite low - // on well behaved content. A specially crafted image could roll over. - // border_ could also be adjusted to concentrate on just the center of - // the images for an HD capture in order to reduce the possiblity of - // rollover. - const uint8_t *lineTop = imgBuf - width_ + border_; - const uint8_t *lineCen = imgBuf + border_; - const uint8_t *lineBot = imgBuf + width_ + border_; - - for (int32_t j = 0; j < width_end - border_; j += 16) { - const __m128i t = _mm_loadu_si128((__m128i*)(lineTop)); - const __m128i l = _mm_loadu_si128((__m128i*)(lineCen - 1)); - const __m128i c = _mm_loadu_si128((__m128i*)(lineCen)); - const __m128i r = _mm_loadu_si128((__m128i*)(lineCen + 1)); - const __m128i b = _mm_loadu_si128((__m128i*)(lineBot)); - - lineTop += 16; - lineCen += 16; - lineBot += 16; - - // center pixel unpacked - __m128i clo = _mm_unpacklo_epi8(c,z); - __m128i chi = _mm_unpackhi_epi8(c,z); - - // left right pixels unpacked and added together - const __m128i lrlo = _mm_add_epi16(_mm_unpacklo_epi8(l,z), - _mm_unpacklo_epi8(r,z)); - const __m128i lrhi = _mm_add_epi16(_mm_unpackhi_epi8(l,z), - _mm_unpackhi_epi8(r,z)); - - // top & bottom pixels unpacked and added together - const __m128i tblo = _mm_add_epi16(_mm_unpacklo_epi8(t,z), - _mm_unpacklo_epi8(b,z)); - const __m128i tbhi = _mm_add_epi16(_mm_unpackhi_epi8(t,z), - _mm_unpackhi_epi8(b,z)); - - // running sum of all pixels - msa_16 = _mm_add_epi16(msa_16, _mm_add_epi16(chi, clo)); - - clo = _mm_slli_epi16(clo, 1); - chi = _mm_slli_epi16(chi, 1); - const __m128i sevtlo = _mm_subs_epi16(clo, tblo); - const __m128i sevthi = _mm_subs_epi16(chi, tbhi); - const __m128i sehtlo = _mm_subs_epi16(clo, lrlo); - const __m128i sehthi = _mm_subs_epi16(chi, lrhi); - - clo = _mm_slli_epi16(clo, 1); - chi = _mm_slli_epi16(chi, 1); - const __m128i setlo = _mm_subs_epi16(clo, _mm_add_epi16(lrlo, tblo)); - const __m128i sethi = _mm_subs_epi16(chi, _mm_add_epi16(lrhi, tbhi)); - - // Add to 16 bit running sum - se_16 = _mm_add_epi16(se_16, _mm_max_epi16(setlo, - _mm_subs_epi16(z, setlo))); - se_16 = _mm_add_epi16(se_16, _mm_max_epi16(sethi, - _mm_subs_epi16(z, sethi))); - sev_16 = _mm_add_epi16(sev_16, _mm_max_epi16(sevtlo, - _mm_subs_epi16(z, sevtlo))); - sev_16 = _mm_add_epi16(sev_16, _mm_max_epi16(sevthi, - _mm_subs_epi16(z, sevthi))); - seh_16 = _mm_add_epi16(seh_16, _mm_max_epi16(sehtlo, - _mm_subs_epi16(z, sehtlo))); - seh_16 = _mm_add_epi16(seh_16, _mm_max_epi16(sehthi, - _mm_subs_epi16(z, sehthi))); - } - - // Add to 32 bit running sum as to not roll over. - se_32 = _mm_add_epi32(se_32, _mm_add_epi32(_mm_unpackhi_epi16(se_16,z), - _mm_unpacklo_epi16(se_16,z))); - sev_32 = _mm_add_epi32(sev_32, _mm_add_epi32(_mm_unpackhi_epi16(sev_16,z), - _mm_unpacklo_epi16(sev_16,z))); - seh_32 = _mm_add_epi32(seh_32, _mm_add_epi32(_mm_unpackhi_epi16(seh_16,z), - _mm_unpacklo_epi16(seh_16,z))); - msa_32 = _mm_add_epi32(msa_32, _mm_add_epi32(_mm_unpackhi_epi16(msa_16,z), - _mm_unpacklo_epi16(msa_16,z))); - - imgBuf += width_ * skip_num_; - } - - __m128i se_128; - __m128i sev_128; - __m128i seh_128; - __m128i msa_128; - - // Bring sums out of vector registers and into integer register - // domain, summing them along the way. - _mm_store_si128 (&se_128, _mm_add_epi64(_mm_unpackhi_epi32(se_32,z), - _mm_unpacklo_epi32(se_32,z))); - _mm_store_si128 (&sev_128, _mm_add_epi64(_mm_unpackhi_epi32(sev_32,z), - _mm_unpacklo_epi32(sev_32,z))); - _mm_store_si128 (&seh_128, _mm_add_epi64(_mm_unpackhi_epi32(seh_32,z), - _mm_unpacklo_epi32(seh_32,z))); - _mm_store_si128 (&msa_128, _mm_add_epi64(_mm_unpackhi_epi32(msa_32,z), - _mm_unpacklo_epi32(msa_32,z))); - - uint64_t *se_64 = reinterpret_cast<uint64_t*>(&se_128); - uint64_t *sev_64 = reinterpret_cast<uint64_t*>(&sev_128); - uint64_t *seh_64 = reinterpret_cast<uint64_t*>(&seh_128); - uint64_t *msa_64 = reinterpret_cast<uint64_t*>(&msa_128); - - const uint32_t spatialErrSum = se_64[0] + se_64[1]; - const uint32_t spatialErrVSum = sev_64[0] + sev_64[1]; - const uint32_t spatialErrHSum = seh_64[0] + seh_64[1]; - const uint32_t pixelMSA = msa_64[0] + msa_64[1]; - - // Normalize over all pixels. - const float spatialErr = (float)(spatialErrSum >> 2); - const float spatialErrH = (float)(spatialErrHSum >> 1); - const float spatialErrV = (float)(spatialErrVSum >> 1); - const float norm = (float)pixelMSA; - - // 2X2: - spatial_pred_err_ = spatialErr / norm; - - // 1X2: - spatial_pred_err_h_ = spatialErrH / norm; - - // 2X1: - spatial_pred_err_v_ = spatialErrV / norm; - - return VPM_OK; -} - -} // namespace webrtc diff --git a/webrtc/modules/video_processing/main/source/deflickering.cc b/webrtc/modules/video_processing/main/source/deflickering.cc deleted file mode 100644 index 19bc641ac9..0000000000 --- a/webrtc/modules/video_processing/main/source/deflickering.cc +++ /dev/null @@ -1,398 +0,0 @@ -/* - * 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. - */ - -#include "webrtc/modules/video_processing/main/source/deflickering.h" - -#include <math.h> -#include <stdlib.h> - -#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h" -#include "webrtc/system_wrappers/include/logging.h" -#include "webrtc/system_wrappers/include/sort.h" - -namespace webrtc { - -// Detection constants -// (Q4) Maximum allowed deviation for detection. -enum { kFrequencyDeviation = 39 }; -// (Q4) Minimum frequency that can be detected. -enum { kMinFrequencyToDetect = 32 }; -// Number of flickers before we accept detection -enum { kNumFlickerBeforeDetect = 2 }; -enum { kmean_valueScaling = 4 }; // (Q4) In power of 2 -// Dead-zone region in terms of pixel values -enum { kZeroCrossingDeadzone = 10 }; -// Deflickering constants. -// Compute the quantiles over 1 / DownsamplingFactor of the image. -enum { kDownsamplingFactor = 8 }; -enum { kLog2OfDownsamplingFactor = 3 }; - -// To generate in Matlab: -// >> probUW16 = round(2^11 * -// [0.05,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.95,0.97]); -// >> fprintf('%d, ', probUW16) -// Resolution reduced to avoid overflow when multiplying with the -// (potentially) large number of pixels. -const uint16_t VPMDeflickering::prob_uw16_[kNumProbs] = {102, 205, 410, 614, - 819, 1024, 1229, 1434, 1638, 1843, 1946, 1987}; // <Q11> - -// To generate in Matlab: -// >> numQuants = 14; maxOnlyLength = 5; -// >> weightUW16 = round(2^15 * -// [linspace(0.5, 1.0, numQuants - maxOnlyLength)]); -// >> fprintf('%d, %d,\n ', weightUW16); -const uint16_t VPMDeflickering::weight_uw16_[kNumQuants - kMaxOnlyLength] = - {16384, 18432, 20480, 22528, 24576, 26624, 28672, 30720, 32768}; // <Q15> - -VPMDeflickering::VPMDeflickering() { - Reset(); -} - -VPMDeflickering::~VPMDeflickering() {} - -void VPMDeflickering::Reset() { - mean_buffer_length_ = 0; - detection_state_ = 0; - frame_rate_ = 0; - - memset(mean_buffer_, 0, sizeof(int32_t) * kMeanBufferLength); - memset(timestamp_buffer_, 0, sizeof(int32_t) * kMeanBufferLength); - - // Initialize the history with a uniformly distributed histogram. - quant_hist_uw8_[0][0] = 0; - quant_hist_uw8_[0][kNumQuants - 1] = 255; - for (int32_t i = 0; i < kNumProbs; i++) { - // Unsigned round. <Q0> - quant_hist_uw8_[0][i + 1] = static_cast<uint8_t>( - (prob_uw16_[i] * 255 + (1 << 10)) >> 11); - } - - for (int32_t i = 1; i < kFrameHistory_size; i++) { - memcpy(quant_hist_uw8_[i], quant_hist_uw8_[0], - sizeof(uint8_t) * kNumQuants); - } -} - -int32_t VPMDeflickering::ProcessFrame( - VideoFrame* frame, - VideoProcessingModule::FrameStats* stats) { - assert(frame); - uint32_t frame_memory; - uint8_t quant_uw8[kNumQuants]; - uint8_t maxquant_uw8[kNumQuants]; - uint8_t minquant_uw8[kNumQuants]; - uint16_t target_quant_uw16[kNumQuants]; - uint16_t increment_uw16; - uint8_t map_uw8[256]; - - uint16_t tmp_uw16; - uint32_t tmp_uw32; - int width = frame->width(); - int height = frame->height(); - - if (frame->IsZeroSize()) { - return VPM_GENERAL_ERROR; - } - - // Stricter height check due to subsampling size calculation below. - if (height < 2) { - LOG(LS_ERROR) << "Invalid frame size."; - return VPM_GENERAL_ERROR; - } - - if (!VideoProcessingModule::ValidFrameStats(*stats)) { - return VPM_GENERAL_ERROR; - } - - if (PreDetection(frame->timestamp(), *stats) == -1) return VPM_GENERAL_ERROR; - - // Flicker detection - int32_t det_flicker = DetectFlicker(); - if (det_flicker < 0) { - return VPM_GENERAL_ERROR; - } else if (det_flicker != 1) { - return 0; - } - - // Size of luminance component. - const uint32_t y_size = height * width; - - const uint32_t y_sub_size = width * (((height - 1) >> - kLog2OfDownsamplingFactor) + 1); - uint8_t* y_sorted = new uint8_t[y_sub_size]; - uint32_t sort_row_idx = 0; - for (int i = 0; i < height; i += kDownsamplingFactor) { - memcpy(y_sorted + sort_row_idx * width, - frame->buffer(kYPlane) + i * width, width); - sort_row_idx++; - } - - webrtc::Sort(y_sorted, y_sub_size, webrtc::TYPE_UWord8); - - uint32_t prob_idx_uw32 = 0; - quant_uw8[0] = 0; - quant_uw8[kNumQuants - 1] = 255; - - // Ensure we won't get an overflow below. - // In practice, the number of subsampled pixels will not become this large. - if (y_sub_size > (1 << 21) - 1) { - LOG(LS_ERROR) << "Subsampled number of pixels too large."; - return -1; - } - - for (int32_t i = 0; i < kNumProbs; i++) { - // <Q0>. - prob_idx_uw32 = WEBRTC_SPL_UMUL_32_16(y_sub_size, prob_uw16_[i]) >> 11; - quant_uw8[i + 1] = y_sorted[prob_idx_uw32]; - } - - delete [] y_sorted; - y_sorted = NULL; - - // Shift history for new frame. - memmove(quant_hist_uw8_[1], quant_hist_uw8_[0], - (kFrameHistory_size - 1) * kNumQuants * sizeof(uint8_t)); - // Store current frame in history. - memcpy(quant_hist_uw8_[0], quant_uw8, kNumQuants * sizeof(uint8_t)); - - // We use a frame memory equal to the ceiling of half the frame rate to - // ensure we capture an entire period of flicker. - frame_memory = (frame_rate_ + (1 << 5)) >> 5; // Unsigned ceiling. <Q0> - // frame_rate_ in Q4. - if (frame_memory > kFrameHistory_size) { - frame_memory = kFrameHistory_size; - } - - // Get maximum and minimum. - for (int32_t i = 0; i < kNumQuants; i++) { - maxquant_uw8[i] = 0; - minquant_uw8[i] = 255; - for (uint32_t j = 0; j < frame_memory; j++) { - if (quant_hist_uw8_[j][i] > maxquant_uw8[i]) { - maxquant_uw8[i] = quant_hist_uw8_[j][i]; - } - - if (quant_hist_uw8_[j][i] < minquant_uw8[i]) { - minquant_uw8[i] = quant_hist_uw8_[j][i]; - } - } - } - - // Get target quantiles. - for (int32_t i = 0; i < kNumQuants - kMaxOnlyLength; i++) { - // target = w * maxquant_uw8 + (1 - w) * minquant_uw8 - // Weights w = |weight_uw16_| are in Q15, hence the final output has to be - // right shifted by 8 to end up in Q7. - target_quant_uw16[i] = static_cast<uint16_t>(( - weight_uw16_[i] * maxquant_uw8[i] + - ((1 << 15) - weight_uw16_[i]) * minquant_uw8[i]) >> 8); // <Q7> - } - - for (int32_t i = kNumQuants - kMaxOnlyLength; i < kNumQuants; i++) { - target_quant_uw16[i] = ((uint16_t)maxquant_uw8[i]) << 7; - } - - // Compute the map from input to output pixels. - uint16_t mapUW16; // <Q7> - for (int32_t i = 1; i < kNumQuants; i++) { - // As quant and targetQuant are limited to UWord8, it's safe to use Q7 here. - tmp_uw32 = static_cast<uint32_t>(target_quant_uw16[i] - - target_quant_uw16[i - 1]); - tmp_uw16 = static_cast<uint16_t>(quant_uw8[i] - quant_uw8[i - 1]); // <Q0> - - if (tmp_uw16 > 0) { - increment_uw16 = static_cast<uint16_t>(WebRtcSpl_DivU32U16(tmp_uw32, - tmp_uw16)); // <Q7> - } else { - // The value is irrelevant; the loop below will only iterate once. - increment_uw16 = 0; - } - - mapUW16 = target_quant_uw16[i - 1]; - for (uint32_t j = quant_uw8[i - 1]; j < (uint32_t)(quant_uw8[i] + 1); j++) { - // Unsigned round. <Q0> - map_uw8[j] = (uint8_t)((mapUW16 + (1 << 6)) >> 7); - mapUW16 += increment_uw16; - } - } - - // Map to the output frame. - uint8_t* buffer = frame->buffer(kYPlane); - for (uint32_t i = 0; i < y_size; i++) { - buffer[i] = map_uw8[buffer[i]]; - } - - // Frame was altered, so reset stats. - VideoProcessingModule::ClearFrameStats(stats); - - return VPM_OK; -} - -/** - Performs some pre-detection operations. Must be called before - DetectFlicker(). - - \param[in] timestamp Timestamp of the current frame. - \param[in] stats Statistics of the current frame. - - \return 0: Success\n - 2: Detection not possible due to flickering frequency too close to - zero.\n - -1: Error -*/ -int32_t VPMDeflickering::PreDetection(const uint32_t timestamp, - const VideoProcessingModule::FrameStats& stats) { - int32_t mean_val; // Mean value of frame (Q4) - uint32_t frame_rate = 0; - int32_t meanBufferLength; // Temp variable. - - mean_val = ((stats.sum << kmean_valueScaling) / stats.num_pixels); - // Update mean value buffer. - // This should be done even though we might end up in an unreliable detection. - memmove(mean_buffer_ + 1, mean_buffer_, - (kMeanBufferLength - 1) * sizeof(int32_t)); - mean_buffer_[0] = mean_val; - - // Update timestamp buffer. - // This should be done even though we might end up in an unreliable detection. - memmove(timestamp_buffer_ + 1, timestamp_buffer_, (kMeanBufferLength - 1) * - sizeof(uint32_t)); - timestamp_buffer_[0] = timestamp; - -/* Compute current frame rate (Q4) */ - if (timestamp_buffer_[kMeanBufferLength - 1] != 0) { - frame_rate = ((90000 << 4) * (kMeanBufferLength - 1)); - frame_rate /= - (timestamp_buffer_[0] - timestamp_buffer_[kMeanBufferLength - 1]); - } else if (timestamp_buffer_[1] != 0) { - frame_rate = (90000 << 4) / (timestamp_buffer_[0] - timestamp_buffer_[1]); - } - - /* Determine required size of mean value buffer (mean_buffer_length_) */ - if (frame_rate == 0) { - meanBufferLength = 1; - } else { - meanBufferLength = - (kNumFlickerBeforeDetect * frame_rate) / kMinFrequencyToDetect; - } - /* Sanity check of buffer length */ - if (meanBufferLength >= kMeanBufferLength) { - /* Too long buffer. The flickering frequency is too close to zero, which - * makes the estimation unreliable. - */ - mean_buffer_length_ = 0; - return 2; - } - mean_buffer_length_ = meanBufferLength; - - if ((timestamp_buffer_[mean_buffer_length_ - 1] != 0) && - (mean_buffer_length_ != 1)) { - frame_rate = ((90000 << 4) * (mean_buffer_length_ - 1)); - frame_rate /= - (timestamp_buffer_[0] - timestamp_buffer_[mean_buffer_length_ - 1]); - } else if (timestamp_buffer_[1] != 0) { - frame_rate = (90000 << 4) / (timestamp_buffer_[0] - timestamp_buffer_[1]); - } - frame_rate_ = frame_rate; - - return VPM_OK; -} - -/** - This function detects flicker in the video stream. As a side effect the - mean value buffer is updated with the new mean value. - - \return 0: No flickering detected\n - 1: Flickering detected\n - 2: Detection not possible due to unreliable frequency interval - -1: Error -*/ -int32_t VPMDeflickering::DetectFlicker() { - uint32_t i; - int32_t freqEst; // (Q4) Frequency estimate to base detection upon - int32_t ret_val = -1; - - /* Sanity check for mean_buffer_length_ */ - if (mean_buffer_length_ < 2) { - /* Not possible to estimate frequency */ - return(2); - } - // Count zero crossings with a dead zone to be robust against noise. If the - // noise std is 2 pixel this corresponds to about 95% confidence interval. - int32_t deadzone = (kZeroCrossingDeadzone << kmean_valueScaling); // Q4 - int32_t meanOfBuffer = 0; // Mean value of mean value buffer. - int32_t numZeros = 0; // Number of zeros that cross the dead-zone. - int32_t cntState = 0; // State variable for zero crossing regions. - int32_t cntStateOld = 0; // Previous state for zero crossing regions. - - for (i = 0; i < mean_buffer_length_; i++) { - meanOfBuffer += mean_buffer_[i]; - } - meanOfBuffer += (mean_buffer_length_ >> 1); // Rounding, not truncation. - meanOfBuffer /= mean_buffer_length_; - - // Count zero crossings. - cntStateOld = (mean_buffer_[0] >= (meanOfBuffer + deadzone)); - cntStateOld -= (mean_buffer_[0] <= (meanOfBuffer - deadzone)); - for (i = 1; i < mean_buffer_length_; i++) { - cntState = (mean_buffer_[i] >= (meanOfBuffer + deadzone)); - cntState -= (mean_buffer_[i] <= (meanOfBuffer - deadzone)); - if (cntStateOld == 0) { - cntStateOld = -cntState; - } - if (((cntState + cntStateOld) == 0) && (cntState != 0)) { - numZeros++; - cntStateOld = cntState; - } - } - // END count zero crossings. - - /* Frequency estimation according to: - * freqEst = numZeros * frame_rate / 2 / mean_buffer_length_; - * - * Resolution is set to Q4 - */ - freqEst = ((numZeros * 90000) << 3); - freqEst /= - (timestamp_buffer_[0] - timestamp_buffer_[mean_buffer_length_ - 1]); - - /* Translate frequency estimate to regions close to 100 and 120 Hz */ - uint8_t freqState = 0; // Current translation state; - // (0) Not in interval, - // (1) Within valid interval, - // (2) Out of range - int32_t freqAlias = freqEst; - if (freqEst > kMinFrequencyToDetect) { - uint8_t aliasState = 1; - while(freqState == 0) { - /* Increase frequency */ - freqAlias += (aliasState * frame_rate_); - freqAlias += ((freqEst << 1) * (1 - (aliasState << 1))); - /* Compute state */ - freqState = (abs(freqAlias - (100 << 4)) <= kFrequencyDeviation); - freqState += (abs(freqAlias - (120 << 4)) <= kFrequencyDeviation); - freqState += 2 * (freqAlias > ((120 << 4) + kFrequencyDeviation)); - /* Switch alias state */ - aliasState++; - aliasState &= 0x01; - } - } - /* Is frequency estimate within detection region? */ - if (freqState == 1) { - ret_val = 1; - } else if (freqState == 0) { - ret_val = 2; - } else { - ret_val = 0; - } - return ret_val; -} - -} // namespace webrtc diff --git a/webrtc/modules/video_processing/main/source/deflickering.h b/webrtc/modules/video_processing/main/source/deflickering.h deleted file mode 100644 index 36e6845d71..0000000000 --- a/webrtc/modules/video_processing/main/source/deflickering.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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. - */ - -#ifndef WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCEdeflickering__H -#define WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCEdeflickering__H - -#include <string.h> // NULL - -#include "webrtc/modules/video_processing/main/interface/video_processing.h" -#include "webrtc/typedefs.h" - -namespace webrtc { - -class VPMDeflickering { - public: - VPMDeflickering(); - ~VPMDeflickering(); - - void Reset(); - int32_t ProcessFrame(VideoFrame* frame, - VideoProcessingModule::FrameStats* stats); - - private: - int32_t PreDetection(uint32_t timestamp, - const VideoProcessingModule::FrameStats& stats); - - int32_t DetectFlicker(); - - enum { kMeanBufferLength = 32 }; - enum { kFrameHistory_size = 15 }; - enum { kNumProbs = 12 }; - enum { kNumQuants = kNumProbs + 2 }; - enum { kMaxOnlyLength = 5 }; - - uint32_t mean_buffer_length_; - uint8_t detection_state_; // 0: No flickering - // 1: Flickering detected - // 2: In flickering - int32_t mean_buffer_[kMeanBufferLength]; - uint32_t timestamp_buffer_[kMeanBufferLength]; - uint32_t frame_rate_; - static const uint16_t prob_uw16_[kNumProbs]; - static const uint16_t weight_uw16_[kNumQuants - kMaxOnlyLength]; - uint8_t quant_hist_uw8_[kFrameHistory_size][kNumQuants]; -}; - -} // namespace webrtc - -#endif // WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCEdeflickering__H diff --git a/webrtc/modules/video_processing/main/source/frame_preprocessor.cc b/webrtc/modules/video_processing/main/source/frame_preprocessor.cc deleted file mode 100644 index a9d77c2e0c..0000000000 --- a/webrtc/modules/video_processing/main/source/frame_preprocessor.cc +++ /dev/null @@ -1,136 +0,0 @@ -/* - * 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. - */ - -#include "webrtc/modules/video_processing/main/source/frame_preprocessor.h" - -namespace webrtc { - -VPMFramePreprocessor::VPMFramePreprocessor() - : content_metrics_(NULL), - resampled_frame_(), - enable_ca_(false), - frame_cnt_(0) { - spatial_resampler_ = new VPMSimpleSpatialResampler(); - ca_ = new VPMContentAnalysis(true); - vd_ = new VPMVideoDecimator(); -} - -VPMFramePreprocessor::~VPMFramePreprocessor() { - Reset(); - delete spatial_resampler_; - delete ca_; - delete vd_; -} - -void VPMFramePreprocessor::Reset() { - ca_->Release(); - vd_->Reset(); - content_metrics_ = NULL; - spatial_resampler_->Reset(); - enable_ca_ = false; - frame_cnt_ = 0; -} - -void VPMFramePreprocessor::EnableTemporalDecimation(bool enable) { - vd_->EnableTemporalDecimation(enable); -} - -void VPMFramePreprocessor::EnableContentAnalysis(bool enable) { - enable_ca_ = enable; -} - -void VPMFramePreprocessor::SetInputFrameResampleMode( - VideoFrameResampling resampling_mode) { - spatial_resampler_->SetInputFrameResampleMode(resampling_mode); -} - -int32_t VPMFramePreprocessor::SetTargetResolution( - uint32_t width, uint32_t height, uint32_t frame_rate) { - if ( (width == 0) || (height == 0) || (frame_rate == 0)) { - return VPM_PARAMETER_ERROR; - } - int32_t ret_val = 0; - ret_val = spatial_resampler_->SetTargetFrameSize(width, height); - - if (ret_val < 0) return ret_val; - - vd_->SetTargetFramerate(frame_rate); - return VPM_OK; -} - -void VPMFramePreprocessor::SetTargetFramerate(int frame_rate) { - if (frame_rate == -1) { - vd_->EnableTemporalDecimation(false); - } else { - vd_->EnableTemporalDecimation(true); - vd_->SetTargetFramerate(frame_rate); - } -} - -void VPMFramePreprocessor::UpdateIncomingframe_rate() { - vd_->UpdateIncomingframe_rate(); -} - -uint32_t VPMFramePreprocessor::Decimatedframe_rate() { - return vd_->Decimatedframe_rate(); -} - - -uint32_t VPMFramePreprocessor::DecimatedWidth() const { - return spatial_resampler_->TargetWidth(); -} - - -uint32_t VPMFramePreprocessor::DecimatedHeight() const { - return spatial_resampler_->TargetHeight(); -} - -int32_t VPMFramePreprocessor::PreprocessFrame(const VideoFrame& frame, - VideoFrame** processed_frame) { - if (frame.IsZeroSize()) { - return VPM_PARAMETER_ERROR; - } - - vd_->UpdateIncomingframe_rate(); - - if (vd_->DropFrame()) { - return 1; // drop 1 frame - } - - // Resizing incoming frame if needed. Otherwise, remains NULL. - // We are not allowed to resample the input frame (must make a copy of it). - *processed_frame = NULL; - if (spatial_resampler_->ApplyResample(frame.width(), frame.height())) { - int32_t ret = spatial_resampler_->ResampleFrame(frame, &resampled_frame_); - if (ret != VPM_OK) return ret; - *processed_frame = &resampled_frame_; - } - - // Perform content analysis on the frame to be encoded. - if (enable_ca_) { - // Compute new metrics every |kSkipFramesCA| frames, starting with - // the first frame. - if (frame_cnt_ % kSkipFrameCA == 0) { - if (*processed_frame == NULL) { - content_metrics_ = ca_->ComputeContentMetrics(frame); - } else { - content_metrics_ = ca_->ComputeContentMetrics(resampled_frame_); - } - } - ++frame_cnt_; - } - return VPM_OK; -} - -VideoContentMetrics* VPMFramePreprocessor::ContentMetrics() const { - return content_metrics_; -} - -} // namespace diff --git a/webrtc/modules/video_processing/main/source/frame_preprocessor.h b/webrtc/modules/video_processing/main/source/frame_preprocessor.h deleted file mode 100644 index 895e457cc6..0000000000 --- a/webrtc/modules/video_processing/main/source/frame_preprocessor.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * 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. - */ - -/* - * frame_preprocessor.h - */ -#ifndef WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_FRAME_PREPROCESSOR_H -#define WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_FRAME_PREPROCESSOR_H - -#include "webrtc/modules/video_processing/main/interface/video_processing.h" -#include "webrtc/modules/video_processing/main/source/content_analysis.h" -#include "webrtc/modules/video_processing/main/source/spatial_resampler.h" -#include "webrtc/modules/video_processing/main/source/video_decimator.h" -#include "webrtc/typedefs.h" - -namespace webrtc { - -class VPMFramePreprocessor { - public: - VPMFramePreprocessor(); - ~VPMFramePreprocessor(); - - void Reset(); - - // Enable temporal decimation. - void EnableTemporalDecimation(bool enable); - - void SetInputFrameResampleMode(VideoFrameResampling resampling_mode); - - // Enable content analysis. - void EnableContentAnalysis(bool enable); - - // Set target resolution: frame rate and dimension. - int32_t SetTargetResolution(uint32_t width, uint32_t height, - uint32_t frame_rate); - - // Set target frame rate. - void SetTargetFramerate(int frame_rate); - - // Update incoming frame rate/dimension. - void UpdateIncomingframe_rate(); - - int32_t updateIncomingFrameSize(uint32_t width, uint32_t height); - - // Set decimated values: frame rate/dimension. - uint32_t Decimatedframe_rate(); - uint32_t DecimatedWidth() const; - uint32_t DecimatedHeight() const; - - // Preprocess output: - int32_t PreprocessFrame(const VideoFrame& frame, - VideoFrame** processed_frame); - VideoContentMetrics* ContentMetrics() const; - - private: - // The content does not change so much every frame, so to reduce complexity - // we can compute new content metrics every |kSkipFrameCA| frames. - enum { kSkipFrameCA = 2 }; - - VideoContentMetrics* content_metrics_; - VideoFrame resampled_frame_; - VPMSpatialResampler* spatial_resampler_; - VPMContentAnalysis* ca_; - VPMVideoDecimator* vd_; - bool enable_ca_; - int frame_cnt_; - -}; - -} // namespace webrtc - -#endif // WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_FRAME_PREPROCESSOR_H diff --git a/webrtc/modules/video_processing/main/source/spatial_resampler.cc b/webrtc/modules/video_processing/main/source/spatial_resampler.cc deleted file mode 100644 index 9360e68b41..0000000000 --- a/webrtc/modules/video_processing/main/source/spatial_resampler.cc +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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. - */ - -#include "webrtc/modules/video_processing/main/source/spatial_resampler.h" - - -namespace webrtc { - -VPMSimpleSpatialResampler::VPMSimpleSpatialResampler() - : resampling_mode_(kFastRescaling), - target_width_(0), - target_height_(0), - scaler_() {} - -VPMSimpleSpatialResampler::~VPMSimpleSpatialResampler() {} - - -int32_t VPMSimpleSpatialResampler::SetTargetFrameSize(int32_t width, - int32_t height) { - if (resampling_mode_ == kNoRescaling) return VPM_OK; - - if (width < 1 || height < 1) return VPM_PARAMETER_ERROR; - - target_width_ = width; - target_height_ = height; - - return VPM_OK; -} - -void VPMSimpleSpatialResampler::SetInputFrameResampleMode( - VideoFrameResampling resampling_mode) { - resampling_mode_ = resampling_mode; -} - -void VPMSimpleSpatialResampler::Reset() { - resampling_mode_ = kFastRescaling; - target_width_ = 0; - target_height_ = 0; -} - -int32_t VPMSimpleSpatialResampler::ResampleFrame(const VideoFrame& inFrame, - VideoFrame* outFrame) { - // Don't copy if frame remains as is. - if (resampling_mode_ == kNoRescaling) - return VPM_OK; - // Check if re-sampling is needed - else if ((inFrame.width() == target_width_) && - (inFrame.height() == target_height_)) { - return VPM_OK; - } - - // Setting scaler - // TODO(mikhal/marpan): Should we allow for setting the filter mode in - // _scale.Set() with |resampling_mode_|? - int ret_val = 0; - ret_val = scaler_.Set(inFrame.width(), inFrame.height(), - target_width_, target_height_, kI420, kI420, kScaleBox); - if (ret_val < 0) - return ret_val; - - ret_val = scaler_.Scale(inFrame, outFrame); - - // Setting time parameters to the output frame. - // Timestamp will be reset in Scale call above, so we should set it after. - outFrame->set_timestamp(inFrame.timestamp()); - outFrame->set_render_time_ms(inFrame.render_time_ms()); - - if (ret_val == 0) - return VPM_OK; - else - return VPM_SCALE_ERROR; -} - -int32_t VPMSimpleSpatialResampler::TargetHeight() { - return target_height_; -} - -int32_t VPMSimpleSpatialResampler::TargetWidth() { - return target_width_; -} - -bool VPMSimpleSpatialResampler::ApplyResample(int32_t width, - int32_t height) { - if ((width == target_width_ && height == target_height_) || - resampling_mode_ == kNoRescaling) - return false; - else - return true; -} - -} // namespace webrtc diff --git a/webrtc/modules/video_processing/main/source/spatial_resampler.h b/webrtc/modules/video_processing/main/source/spatial_resampler.h deleted file mode 100644 index f965a40a83..0000000000 --- a/webrtc/modules/video_processing/main/source/spatial_resampler.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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 WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_SPATIAL_RESAMPLER_H -#define WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_SPATIAL_RESAMPLER_H - -#include "webrtc/typedefs.h" - -#include "webrtc/modules/interface/module_common_types.h" -#include "webrtc/modules/video_processing/main/interface/video_processing_defines.h" - -#include "webrtc/common_video/libyuv/include/scaler.h" -#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" - -namespace webrtc { - -class VPMSpatialResampler { - public: - virtual ~VPMSpatialResampler() {}; - virtual int32_t SetTargetFrameSize(int32_t width, int32_t height) = 0; - virtual void SetInputFrameResampleMode(VideoFrameResampling - resampling_mode) = 0; - virtual void Reset() = 0; - virtual int32_t ResampleFrame(const VideoFrame& inFrame, - VideoFrame* outFrame) = 0; - virtual int32_t TargetWidth() = 0; - virtual int32_t TargetHeight() = 0; - virtual bool ApplyResample(int32_t width, int32_t height) = 0; -}; - -class VPMSimpleSpatialResampler : public VPMSpatialResampler { - public: - VPMSimpleSpatialResampler(); - ~VPMSimpleSpatialResampler(); - virtual int32_t SetTargetFrameSize(int32_t width, int32_t height); - virtual void SetInputFrameResampleMode(VideoFrameResampling resampling_mode); - virtual void Reset(); - virtual int32_t ResampleFrame(const VideoFrame& inFrame, - VideoFrame* outFrame); - virtual int32_t TargetWidth(); - virtual int32_t TargetHeight(); - virtual bool ApplyResample(int32_t width, int32_t height); - - private: - - VideoFrameResampling resampling_mode_; - int32_t target_width_; - int32_t target_height_; - Scaler scaler_; -}; - -} // namespace webrtc - -#endif // WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_SPATIAL_RESAMPLER_H diff --git a/webrtc/modules/video_processing/main/source/video_decimator.cc b/webrtc/modules/video_processing/main/source/video_decimator.cc deleted file mode 100644 index 34c29c1677..0000000000 --- a/webrtc/modules/video_processing/main/source/video_decimator.cc +++ /dev/null @@ -1,146 +0,0 @@ -/* - * 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. - */ - -#include "webrtc/base/checks.h" -#include "webrtc/modules/video_processing/main/interface/video_processing.h" -#include "webrtc/modules/video_processing/main/source/video_decimator.h" -#include "webrtc/system_wrappers/include/tick_util.h" - -#define VD_MIN(a, b) ((a) < (b)) ? (a) : (b) - -namespace webrtc { - -VPMVideoDecimator::VPMVideoDecimator() { - Reset(); -} - -VPMVideoDecimator::~VPMVideoDecimator() {} - -void VPMVideoDecimator::Reset() { - overshoot_modifier_ = 0; - drop_count_ = 0; - keep_count_ = 0; - target_frame_rate_ = 30; - incoming_frame_rate_ = 0.0f; - memset(incoming_frame_times_, 0, sizeof(incoming_frame_times_)); - enable_temporal_decimation_ = true; -} - -void VPMVideoDecimator::EnableTemporalDecimation(bool enable) { - enable_temporal_decimation_ = enable; -} - -void VPMVideoDecimator::SetTargetFramerate(int frame_rate) { - RTC_DCHECK(frame_rate); - target_frame_rate_ = frame_rate; -} - -bool VPMVideoDecimator::DropFrame() { - if (!enable_temporal_decimation_) return false; - - if (incoming_frame_rate_ <= 0) return false; - - const uint32_t incomingframe_rate = - static_cast<uint32_t>(incoming_frame_rate_ + 0.5f); - - if (target_frame_rate_ == 0) return true; - - bool drop = false; - if (incomingframe_rate > target_frame_rate_) { - int32_t overshoot = - overshoot_modifier_ + (incomingframe_rate - target_frame_rate_); - if (overshoot < 0) { - overshoot = 0; - overshoot_modifier_ = 0; - } - - if (overshoot && 2 * overshoot < (int32_t) incomingframe_rate) { - if (drop_count_) { // Just got here so drop to be sure. - drop_count_ = 0; - return true; - } - const uint32_t dropVar = incomingframe_rate / overshoot; - - if (keep_count_ >= dropVar) { - drop = true; - overshoot_modifier_ = -((int32_t) incomingframe_rate % overshoot) / 3; - keep_count_ = 1; - } else { - keep_count_++; - } - } else { - keep_count_ = 0; - const uint32_t dropVar = overshoot / target_frame_rate_; - if (drop_count_ < dropVar) { - drop = true; - drop_count_++; - } else { - overshoot_modifier_ = overshoot % target_frame_rate_; - drop = false; - drop_count_ = 0; - } - } - } - return drop; -} - - -uint32_t VPMVideoDecimator::Decimatedframe_rate() { -ProcessIncomingframe_rate(TickTime::MillisecondTimestamp()); - if (!enable_temporal_decimation_) { - return static_cast<uint32_t>(incoming_frame_rate_ + 0.5f); - } - return VD_MIN(target_frame_rate_, - static_cast<uint32_t>(incoming_frame_rate_ + 0.5f)); -} - -uint32_t VPMVideoDecimator::Inputframe_rate() { - ProcessIncomingframe_rate(TickTime::MillisecondTimestamp()); - return static_cast<uint32_t>(incoming_frame_rate_ + 0.5f); -} - -void VPMVideoDecimator::UpdateIncomingframe_rate() { - int64_t now = TickTime::MillisecondTimestamp(); - if (incoming_frame_times_[0] == 0) { - // First no shift. - } else { - // Shift. - for (int i = kFrameCountHistory_size - 2; i >= 0; i--) { - incoming_frame_times_[i+1] = incoming_frame_times_[i]; - } - } - incoming_frame_times_[0] = now; - ProcessIncomingframe_rate(now); -} - -void VPMVideoDecimator::ProcessIncomingframe_rate(int64_t now) { - int32_t num = 0; - int32_t nrOfFrames = 0; - for (num = 1; num < (kFrameCountHistory_size - 1); num++) { - // Don't use data older than 2sec. - if (incoming_frame_times_[num] <= 0 || - now - incoming_frame_times_[num] > kFrameHistoryWindowMs) { - break; - } else { - nrOfFrames++; - } - } - if (num > 1) { - int64_t diff = now - incoming_frame_times_[num-1]; - incoming_frame_rate_ = 1.0; - if (diff > 0) { - incoming_frame_rate_ = nrOfFrames * 1000.0f / static_cast<float>(diff); - } - } else { - incoming_frame_rate_ = static_cast<float>(nrOfFrames); - } -} - -} // namespace webrtc diff --git a/webrtc/modules/video_processing/main/source/video_decimator.h b/webrtc/modules/video_processing/main/source/video_decimator.h deleted file mode 100644 index 3d4573caf8..0000000000 --- a/webrtc/modules/video_processing/main/source/video_decimator.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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. - */ - -#ifndef WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_VIDEO_DECIMATOR_H -#define WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_VIDEO_DECIMATOR_H - -#include "webrtc/modules/interface/module_common_types.h" -#include "webrtc/typedefs.h" - -namespace webrtc { - -class VPMVideoDecimator { - public: - VPMVideoDecimator(); - ~VPMVideoDecimator(); - - void Reset(); - - void EnableTemporalDecimation(bool enable); - - void SetTargetFramerate(int frame_rate); - - bool DropFrame(); - - void UpdateIncomingframe_rate(); - - // Get Decimated Frame Rate/Dimensions. - uint32_t Decimatedframe_rate(); - - // Get input frame rate. - uint32_t Inputframe_rate(); - - private: - void ProcessIncomingframe_rate(int64_t now); - - enum { kFrameCountHistory_size = 90}; - enum { kFrameHistoryWindowMs = 2000}; - - // Temporal decimation. - int32_t overshoot_modifier_; - uint32_t drop_count_; - uint32_t keep_count_; - uint32_t target_frame_rate_; - float incoming_frame_rate_; - int64_t incoming_frame_times_[kFrameCountHistory_size]; - bool enable_temporal_decimation_; -}; - -} // namespace webrtc - -#endif // WEBRTC_MODULES_VIDEO_PROCESSING_MAIN_SOURCE_VIDEO_DECIMATOR_H diff --git a/webrtc/modules/video_processing/main/source/video_processing_impl.cc b/webrtc/modules/video_processing/main/source/video_processing_impl.cc deleted file mode 100644 index eaaf14f6ad..0000000000 --- a/webrtc/modules/video_processing/main/source/video_processing_impl.cc +++ /dev/null @@ -1,183 +0,0 @@ -/* - * 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. - */ - - -#include "webrtc/modules/video_processing/main/source/video_processing_impl.h" -#include "webrtc/system_wrappers/include/critical_section_wrapper.h" -#include "webrtc/system_wrappers/include/logging.h" - -#include <assert.h> - -namespace webrtc { - -namespace { -void SetSubSampling(VideoProcessingModule::FrameStats* stats, - const int32_t width, - const int32_t height) { - if (width * height >= 640 * 480) { - stats->subSamplWidth = 3; - stats->subSamplHeight = 3; - } else if (width * height >= 352 * 288) { - stats->subSamplWidth = 2; - stats->subSamplHeight = 2; - } else if (width * height >= 176 * 144) { - stats->subSamplWidth = 1; - stats->subSamplHeight = 1; - } else { - stats->subSamplWidth = 0; - stats->subSamplHeight = 0; - } -} -} // namespace - -VideoProcessingModule* VideoProcessingModule::Create() { - return new VideoProcessingModuleImpl(); -} - -void VideoProcessingModule::Destroy(VideoProcessingModule* module) { - if (module) - delete static_cast<VideoProcessingModuleImpl*>(module); -} - -VideoProcessingModuleImpl::VideoProcessingModuleImpl() {} -VideoProcessingModuleImpl::~VideoProcessingModuleImpl() {} - -void VideoProcessingModuleImpl::Reset() { - rtc::CritScope mutex(&mutex_); - deflickering_.Reset(); - brightness_detection_.Reset(); - frame_pre_processor_.Reset(); -} - -int32_t VideoProcessingModule::GetFrameStats(FrameStats* stats, - const VideoFrame& frame) { - if (frame.IsZeroSize()) { - LOG(LS_ERROR) << "Zero size frame."; - return VPM_PARAMETER_ERROR; - } - - int width = frame.width(); - int height = frame.height(); - - ClearFrameStats(stats); // The histogram needs to be zeroed out. - SetSubSampling(stats, width, height); - - const uint8_t* buffer = frame.buffer(kYPlane); - // Compute histogram and sum of frame - for (int i = 0; i < height; i += (1 << stats->subSamplHeight)) { - int k = i * width; - for (int j = 0; j < width; j += (1 << stats->subSamplWidth)) { - stats->hist[buffer[k + j]]++; - stats->sum += buffer[k + j]; - } - } - - stats->num_pixels = (width * height) / ((1 << stats->subSamplWidth) * - (1 << stats->subSamplHeight)); - assert(stats->num_pixels > 0); - - // Compute mean value of frame - stats->mean = stats->sum / stats->num_pixels; - - return VPM_OK; -} - -bool VideoProcessingModule::ValidFrameStats(const FrameStats& stats) { - if (stats.num_pixels == 0) { - LOG(LS_WARNING) << "Invalid frame stats."; - return false; - } - return true; -} - -void VideoProcessingModule::ClearFrameStats(FrameStats* stats) { - stats->mean = 0; - stats->sum = 0; - stats->num_pixels = 0; - stats->subSamplWidth = 0; - stats->subSamplHeight = 0; - memset(stats->hist, 0, sizeof(stats->hist)); -} - -int32_t VideoProcessingModule::Brighten(VideoFrame* frame, int delta) { - return VideoProcessing::Brighten(frame, delta); -} - -int32_t VideoProcessingModuleImpl::Deflickering(VideoFrame* frame, - FrameStats* stats) { - rtc::CritScope mutex(&mutex_); - return deflickering_.ProcessFrame(frame, stats); -} - -int32_t VideoProcessingModuleImpl::BrightnessDetection( - const VideoFrame& frame, - const FrameStats& stats) { - rtc::CritScope mutex(&mutex_); - return brightness_detection_.ProcessFrame(frame, stats); -} - - -void VideoProcessingModuleImpl::EnableTemporalDecimation(bool enable) { - rtc::CritScope mutex(&mutex_); - frame_pre_processor_.EnableTemporalDecimation(enable); -} - - -void VideoProcessingModuleImpl::SetInputFrameResampleMode(VideoFrameResampling - resampling_mode) { - rtc::CritScope cs(&mutex_); - frame_pre_processor_.SetInputFrameResampleMode(resampling_mode); -} - -int32_t VideoProcessingModuleImpl::SetTargetResolution(uint32_t width, - uint32_t height, - uint32_t frame_rate) { - rtc::CritScope cs(&mutex_); - return frame_pre_processor_.SetTargetResolution(width, height, frame_rate); -} - -void VideoProcessingModuleImpl::SetTargetFramerate(int frame_rate) { - rtc::CritScope cs(&mutex_); - frame_pre_processor_.SetTargetFramerate(frame_rate); -} - -uint32_t VideoProcessingModuleImpl::Decimatedframe_rate() { - rtc::CritScope cs(&mutex_); - return frame_pre_processor_.Decimatedframe_rate(); -} - -uint32_t VideoProcessingModuleImpl::DecimatedWidth() const { - rtc::CritScope cs(&mutex_); - return frame_pre_processor_.DecimatedWidth(); -} - -uint32_t VideoProcessingModuleImpl::DecimatedHeight() const { - rtc::CritScope cs(&mutex_); - return frame_pre_processor_.DecimatedHeight(); -} - -int32_t VideoProcessingModuleImpl::PreprocessFrame( - const VideoFrame& frame, - VideoFrame** processed_frame) { - rtc::CritScope mutex(&mutex_); - return frame_pre_processor_.PreprocessFrame(frame, processed_frame); -} - -VideoContentMetrics* VideoProcessingModuleImpl::ContentMetrics() const { - rtc::CritScope mutex(&mutex_); - return frame_pre_processor_.ContentMetrics(); -} - -void VideoProcessingModuleImpl::EnableContentAnalysis(bool enable) { - rtc::CritScope mutex(&mutex_); - frame_pre_processor_.EnableContentAnalysis(enable); -} - -} // namespace webrtc diff --git a/webrtc/modules/video_processing/main/source/video_processing_impl.h b/webrtc/modules/video_processing/main/source/video_processing_impl.h deleted file mode 100644 index fed5197f49..0000000000 --- a/webrtc/modules/video_processing/main/source/video_processing_impl.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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. - */ - -#ifndef WEBRTC_MODULE_VIDEO_PROCESSING_IMPL_H -#define WEBRTC_MODULE_VIDEO_PROCESSING_IMPL_H - -#include "webrtc/base/criticalsection.h" -#include "webrtc/modules/video_processing/main/interface/video_processing.h" -#include "webrtc/modules/video_processing/main/source/brighten.h" -#include "webrtc/modules/video_processing/main/source/brightness_detection.h" -#include "webrtc/modules/video_processing/main/source/deflickering.h" -#include "webrtc/modules/video_processing/main/source/frame_preprocessor.h" - -namespace webrtc { -class CriticalSectionWrapper; - -class VideoProcessingModuleImpl : public VideoProcessingModule { - public: - VideoProcessingModuleImpl(); - ~VideoProcessingModuleImpl() override; - - void Reset() override; - - int32_t Deflickering(VideoFrame* frame, FrameStats* stats) override; - - int32_t BrightnessDetection(const VideoFrame& frame, - const FrameStats& stats) override; - - // Frame pre-processor functions - - // Enable temporal decimation - void EnableTemporalDecimation(bool enable) override; - - void SetInputFrameResampleMode(VideoFrameResampling resampling_mode) override; - - // Enable content analysis - void EnableContentAnalysis(bool enable) override; - - // Set Target Resolution: frame rate and dimension - int32_t SetTargetResolution(uint32_t width, - uint32_t height, - uint32_t frame_rate) override; - - void SetTargetFramerate(int frame_rate) override; - - // Get decimated values: frame rate/dimension - uint32_t Decimatedframe_rate() override; - uint32_t DecimatedWidth() const override; - uint32_t DecimatedHeight() const override; - - // Preprocess: - // Pre-process incoming frame: Sample when needed and compute content - // metrics when enabled. - // If no resampling takes place - processed_frame is set to NULL. - int32_t PreprocessFrame(const VideoFrame& frame, - VideoFrame** processed_frame) override; - VideoContentMetrics* ContentMetrics() const override; - - private: - mutable rtc::CriticalSection mutex_; - VPMDeflickering deflickering_ GUARDED_BY(mutex_); - VPMBrightnessDetection brightness_detection_; - VPMFramePreprocessor frame_pre_processor_; -}; - -} // namespace - -#endif |