1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
113bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org
12c4e10b884294e4622e2470235489809a7bd73a1epbos@webrtc.org#include "webrtc/modules/video_processing/main/source/video_processing_impl.h"
13c4e10b884294e4622e2470235489809a7bd73a1epbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
149402619982e7ab5113d4d2a6fb2cbdf8d50f4f65asapersson@webrtc.org#include "webrtc/system_wrappers/interface/logging.h"
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
163f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <assert.h>
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
20b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgnamespace {
21b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgvoid  SetSubSampling(VideoProcessingModule::FrameStats* stats,
22b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                     const int32_t width,
23b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                     const int32_t height) {
24b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  if (width * height >= 640 * 480) {
25b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    stats->subSamplWidth = 3;
26b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    stats->subSamplHeight = 3;
27b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  } else if (width * height >= 352 * 288) {
28b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    stats->subSamplWidth = 2;
29b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    stats->subSamplHeight = 2;
30b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  } else if (width * height >= 176 * 144) {
31b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    stats->subSamplWidth = 1;
32b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    stats->subSamplHeight = 1;
33b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  } else {
34b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    stats->subSamplWidth = 0;
35b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    stats->subSamplHeight = 0;
36b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  }
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
38b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org}  // namespace
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
40b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgVideoProcessingModule* VideoProcessingModule::Create(const int32_t id) {
41b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return new VideoProcessingModuleImpl(id);
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgvoid VideoProcessingModule::Destroy(VideoProcessingModule* module) {
45b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  if (module)
46b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    delete static_cast<VideoProcessingModuleImpl*>(module);
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
49b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModuleImpl::ChangeUniqueId(const int32_t id) {
50b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
51b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  id_ = id;
52b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  brightness_detection_.ChangeUniqueId(id);
53b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  deflickering_.ChangeUniqueId(id);
54b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  denoising_.ChangeUniqueId(id);
55b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  frame_pre_processor_.ChangeUniqueId(id);
56b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return VPM_OK;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
59b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModuleImpl::Id() const {
60b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
61b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return id_;
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
64b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgVideoProcessingModuleImpl::VideoProcessingModuleImpl(const int32_t id)
65b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    : id_(id),
66b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    mutex_(*CriticalSectionWrapper::CreateCriticalSection()) {
67b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  brightness_detection_.ChangeUniqueId(id);
68b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  deflickering_.ChangeUniqueId(id);
69b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  denoising_.ChangeUniqueId(id);
70b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  frame_pre_processor_.ChangeUniqueId(id);
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
73b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgVideoProcessingModuleImpl::~VideoProcessingModuleImpl() {
74b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  delete &mutex_;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
77b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgvoid VideoProcessingModuleImpl::Reset() {
78b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
79b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  deflickering_.Reset();
80b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  denoising_.Reset();
81b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  brightness_detection_.Reset();
82b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  frame_pre_processor_.Reset();
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
85b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModule::GetFrameStats(FrameStats* stats,
86b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                                             const I420VideoFrame& frame) {
87b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  if (frame.IsZeroSize()) {
889402619982e7ab5113d4d2a6fb2cbdf8d50f4f65asapersson@webrtc.org    LOG(LS_ERROR) << "Zero size frame.";
89b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    return VPM_PARAMETER_ERROR;
90b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  }
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
92b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  int width = frame.width();
93b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  int height = frame.height();
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
95b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  ClearFrameStats(stats);  // The histogram needs to be zeroed out.
96b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  SetSubSampling(stats, width, height);
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
98b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  const uint8_t* buffer = frame.buffer(kYPlane);
99b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  // Compute histogram and sum of frame
100b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  for (int i = 0; i < height; i += (1 << stats->subSamplHeight)) {
101b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    int k = i * width;
102b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    for (int j = 0; j < width; j += (1 << stats->subSamplWidth)) {
103b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org      stats->hist[buffer[k + j]]++;
104b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org      stats->sum += buffer[k + j];
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
106b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  }
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
108b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  stats->num_pixels = (width * height) / ((1 << stats->subSamplWidth) *
109b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                     (1 << stats->subSamplHeight));
110b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  assert(stats->num_pixels > 0);
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
112b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  // Compute mean value of frame
113b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  stats->mean = stats->sum / stats->num_pixels;
114b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org
115b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return VPM_OK;
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
118b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgbool VideoProcessingModule::ValidFrameStats(const FrameStats& stats) {
1199402619982e7ab5113d4d2a6fb2cbdf8d50f4f65asapersson@webrtc.org  if (stats.num_pixels == 0) {
1209402619982e7ab5113d4d2a6fb2cbdf8d50f4f65asapersson@webrtc.org    LOG(LS_WARNING) << "Invalid frame stats.";
1219402619982e7ab5113d4d2a6fb2cbdf8d50f4f65asapersson@webrtc.org    return false;
1229402619982e7ab5113d4d2a6fb2cbdf8d50f4f65asapersson@webrtc.org  }
123b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return true;
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
126b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgvoid VideoProcessingModule::ClearFrameStats(FrameStats* stats) {
127b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  stats->mean = 0;
128b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  stats->sum = 0;
129b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  stats->num_pixels = 0;
130b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  stats->subSamplWidth = 0;
131b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  stats->subSamplHeight = 0;
132b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  memset(stats->hist, 0, sizeof(stats->hist));
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
135b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModule::ColorEnhancement(I420VideoFrame* frame) {
136b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return VideoProcessing::ColorEnhancement(frame);
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
139b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModule::Brighten(I420VideoFrame* frame, int delta) {
140b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return VideoProcessing::Brighten(frame, delta);
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
143b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModuleImpl::Deflickering(I420VideoFrame* frame,
144b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                                                FrameStats* stats) {
145b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
146b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return deflickering_.ProcessFrame(frame, stats);
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
149b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModuleImpl::Denoising(I420VideoFrame* frame) {
150b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
151b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return denoising_.ProcessFrame(frame);
152b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org}
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
154b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModuleImpl::BrightnessDetection(
155b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  const I420VideoFrame& frame,
156b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  const FrameStats& stats) {
157b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
158b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return brightness_detection_.ProcessFrame(frame, stats);
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
162b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgvoid VideoProcessingModuleImpl::EnableTemporalDecimation(bool enable) {
163b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
164b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  frame_pre_processor_.EnableTemporalDecimation(enable);
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
168b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgvoid VideoProcessingModuleImpl::SetInputFrameResampleMode(VideoFrameResampling
169b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                                                          resampling_mode) {
170b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped cs(&mutex_);
171b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  frame_pre_processor_.SetInputFrameResampleMode(resampling_mode);
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
174b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModuleImpl::SetTargetResolution(uint32_t width,
175b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                                                       uint32_t height,
176b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                                                       uint32_t frame_rate) {
177b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped cs(&mutex_);
178b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return frame_pre_processor_.SetTargetResolution(width, height, frame_rate);
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
181b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orguint32_t VideoProcessingModuleImpl::Decimatedframe_rate() {
182b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped cs(&mutex_);
183b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return  frame_pre_processor_.Decimatedframe_rate();
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
186b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orguint32_t VideoProcessingModuleImpl::DecimatedWidth() const {
187b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped cs(&mutex_);
188b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return frame_pre_processor_.DecimatedWidth();
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
191b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orguint32_t VideoProcessingModuleImpl::DecimatedHeight() const {
192b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped cs(&mutex_);
193b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return frame_pre_processor_.DecimatedHeight();
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
196b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VideoProcessingModuleImpl::PreprocessFrame(
197b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    const I420VideoFrame& frame,
198b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    I420VideoFrame **processed_frame) {
199b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
200b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return frame_pre_processor_.PreprocessFrame(frame, processed_frame);
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
203b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgVideoContentMetrics* VideoProcessingModuleImpl::ContentMetrics() const {
204b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
205b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return frame_pre_processor_.ContentMetrics();
206b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org}
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
208b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgvoid VideoProcessingModuleImpl::EnableContentAnalysis(bool enable) {
209b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  CriticalSectionScoped mutex(&mutex_);
210b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  frame_pre_processor_.EnableContentAnalysis(enable);
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
213b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org}  // namespace webrtc
214