blob: 1d21340b31f204a47911690bf91c764f9863e82a [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
marpan@webrtc.org9d76b4e2012-02-28 23:39:31 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Henrik Kjellander0f59a882015-11-18 22:31:24 +010011#include "webrtc/modules/video_processing/frame_preprocessor.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
mflodmana8565422015-12-07 01:09:52 -080013#include "webrtc/modules/video_processing/video_denoiser.h"
14
niklase@google.com470e71d2011-07-07 08:21:25 +000015namespace webrtc {
16
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000017VPMFramePreprocessor::VPMFramePreprocessor()
Peter Boströmad6fc5a2016-05-12 03:01:31 +020018 : resampled_frame_(), frame_cnt_(0) {
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000019 spatial_resampler_ = new VPMSimpleSpatialResampler();
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000020 vd_ = new VPMVideoDecimator();
nisse90c335a2016-04-27 00:59:22 -070021 EnableDenoising(false);
jackychenafaae0d2016-04-12 23:02:55 -070022 denoised_frame_toggle_ = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000023}
24
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000025VPMFramePreprocessor::~VPMFramePreprocessor() {
26 Reset();
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000027 delete vd_;
jackychen8f9902a2015-11-26 02:59:48 -080028 delete spatial_resampler_;
niklase@google.com470e71d2011-07-07 08:21:25 +000029}
30
mflodman99ab9442015-12-07 22:54:50 -080031void VPMFramePreprocessor::Reset() {
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000032 vd_->Reset();
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000033 spatial_resampler_->Reset();
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000034 frame_cnt_ = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000035}
36
mflodman99ab9442015-12-07 22:54:50 -080037void VPMFramePreprocessor::EnableTemporalDecimation(bool enable) {
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000038 vd_->EnableTemporalDecimation(enable);
niklase@google.com470e71d2011-07-07 08:21:25 +000039}
40
mflodman99ab9442015-12-07 22:54:50 -080041void VPMFramePreprocessor::SetInputFrameResampleMode(
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000042 VideoFrameResampling resampling_mode) {
43 spatial_resampler_->SetInputFrameResampleMode(resampling_mode);
44}
45
mflodman99ab9442015-12-07 22:54:50 -080046int32_t VPMFramePreprocessor::SetTargetResolution(uint32_t width,
47 uint32_t height,
48 uint32_t frame_rate) {
mflodmana8565422015-12-07 01:09:52 -080049 if ((width == 0) || (height == 0) || (frame_rate == 0)) {
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000050 return VPM_PARAMETER_ERROR;
51 }
52 int32_t ret_val = 0;
53 ret_val = spatial_resampler_->SetTargetFrameSize(width, height);
54
mflodman99ab9442015-12-07 22:54:50 -080055 if (ret_val < 0)
56 return ret_val;
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000057
jackychen6e2ce6e2015-07-13 16:26:33 -070058 vd_->SetTargetFramerate(frame_rate);
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000059 return VPM_OK;
60}
61
62void VPMFramePreprocessor::UpdateIncomingframe_rate() {
63 vd_->UpdateIncomingframe_rate();
64}
65
mflodmana8565422015-12-07 01:09:52 -080066uint32_t VPMFramePreprocessor::GetDecimatedFrameRate() {
67 return vd_->GetDecimatedFrameRate();
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000068}
69
mflodmana8565422015-12-07 01:09:52 -080070uint32_t VPMFramePreprocessor::GetDecimatedWidth() const {
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000071 return spatial_resampler_->TargetWidth();
72}
73
mflodmana8565422015-12-07 01:09:52 -080074uint32_t VPMFramePreprocessor::GetDecimatedHeight() const {
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000075 return spatial_resampler_->TargetHeight();
76}
77
nisse90c335a2016-04-27 00:59:22 -070078void VPMFramePreprocessor::EnableDenoising(bool enable) {
jackychenf0b8a372016-01-19 18:18:52 -080079 if (enable) {
80 denoiser_.reset(new VideoDenoiser(true));
81 } else {
82 denoiser_.reset();
83 }
mflodmana8565422015-12-07 01:09:52 -080084}
85
86const VideoFrame* VPMFramePreprocessor::PreprocessFrame(
87 const VideoFrame& frame) {
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000088 if (frame.IsZeroSize()) {
mflodmana8565422015-12-07 01:09:52 -080089 return nullptr;
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000090 }
91
92 vd_->UpdateIncomingframe_rate();
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000093 if (vd_->DropFrame()) {
mflodmana8565422015-12-07 01:09:52 -080094 return nullptr;
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +000095 }
96
mflodmana8565422015-12-07 01:09:52 -080097 const VideoFrame* current_frame = &frame;
98 if (denoiser_) {
Niels Möller6af2e862016-06-17 09:12:44 +020099 rtc::scoped_refptr<I420Buffer>* denoised_frame = &denoised_buffer_[0];
100 rtc::scoped_refptr<I420Buffer>* denoised_frame_prev = &denoised_buffer_[1];
jackychenafaae0d2016-04-12 23:02:55 -0700101 // Swap the buffer to save one memcpy in DenoiseFrame.
102 if (denoised_frame_toggle_) {
Niels Möller6af2e862016-06-17 09:12:44 +0200103 denoised_frame = &denoised_buffer_[1];
104 denoised_frame_prev = &denoised_buffer_[0];
jackychenafaae0d2016-04-12 23:02:55 -0700105 }
106 // Invert the flag.
107 denoised_frame_toggle_ ^= 1;
Niels Möller6af2e862016-06-17 09:12:44 +0200108 denoiser_->DenoiseFrame(current_frame->video_frame_buffer(), denoised_frame,
109 denoised_frame_prev, true);
110 denoised_frame_.ShallowCopy(*current_frame);
111 denoised_frame_.set_video_frame_buffer(*denoised_frame);
112 current_frame = &denoised_frame_;
jackychen8f9902a2015-11-26 02:59:48 -0800113 }
114
mflodmana8565422015-12-07 01:09:52 -0800115 if (spatial_resampler_->ApplyResample(current_frame->width(),
mflodman99ab9442015-12-07 22:54:50 -0800116 current_frame->height())) {
mflodmana8565422015-12-07 01:09:52 -0800117 if (spatial_resampler_->ResampleFrame(*current_frame, &resampled_frame_) !=
118 VPM_OK) {
119 return nullptr;
jackychen8f9902a2015-11-26 02:59:48 -0800120 }
mflodmana8565422015-12-07 01:09:52 -0800121 current_frame = &resampled_frame_;
mikhal@webrtc.orgb43d8072013-10-03 16:42:41 +0000122 }
123
jackychen8f9902a2015-11-26 02:59:48 -0800124 ++frame_cnt_;
mflodmana8565422015-12-07 01:09:52 -0800125 return current_frame;
niklase@google.com470e71d2011-07-07 08:21:25 +0000126}
127
mflodmana8565422015-12-07 01:09:52 -0800128} // namespace webrtc