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
11c4e10b884294e4622e2470235489809a7bd73a1epbos@webrtc.org#include "webrtc/modules/video_processing/main/source/spatial_resampler.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVPMSimpleSpatialResampler::VPMSimpleSpatialResampler()
17b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    : resampling_mode_(kFastRescaling),
18b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org      target_width_(0),
19b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org      target_height_(0),
20b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org      scaler_() {}
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgVPMSimpleSpatialResampler::~VPMSimpleSpatialResampler() {}
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
25b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VPMSimpleSpatialResampler::SetTargetFrameSize(int32_t width,
26b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                                                      int32_t height) {
27b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  if (resampling_mode_ == kNoRescaling) return VPM_OK;
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
29b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  if (width < 1 || height < 1) return VPM_PARAMETER_ERROR;
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
31b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  target_width_ = width;
32b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  target_height_ = height;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return VPM_OK;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
37b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgvoid VPMSimpleSpatialResampler::SetInputFrameResampleMode(
38b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    VideoFrameResampling resampling_mode) {
39b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  resampling_mode_ = resampling_mode;
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
42b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgvoid VPMSimpleSpatialResampler::Reset() {
43b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  resampling_mode_ = kFastRescaling;
44b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  target_width_ = 0;
45b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  target_height_ = 0;
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
48b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VPMSimpleSpatialResampler::ResampleFrame(const I420VideoFrame& inFrame,
49b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                                                 I420VideoFrame* outFrame) {
50b8f8c5e113f2a4ac84a2f3b302c76c1e6ace9ff1mikhal@webrtc.org  // Don't copy if frame remains as is.
51b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  if (resampling_mode_ == kNoRescaling)
52b8f8c5e113f2a4ac84a2f3b302c76c1e6ace9ff1mikhal@webrtc.org     return VPM_OK;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Check if re-sampling is needed
54b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  else if ((inFrame.width() == target_width_) &&
55b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    (inFrame.height() == target_height_))  {
56b8f8c5e113f2a4ac84a2f3b302c76c1e6ace9ff1mikhal@webrtc.org    return VPM_OK;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Setting scaler
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // TODO(mikhal/marpan): Should we allow for setting the filter mode in
61b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  // _scale.Set() with |resampling_mode_|?
62b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  int ret_val = 0;
63b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  ret_val = scaler_.Set(inFrame.width(), inFrame.height(),
64b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                       target_width_, target_height_, kI420, kI420, kScaleBox);
65b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  if (ret_val < 0)
66b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org    return ret_val;
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  ret_val = scaler_.Scale(inFrame, outFrame);
69d662a922139974870f321c567b3720ac5caa3772wu@webrtc.org
70d662a922139974870f321c567b3720ac5caa3772wu@webrtc.org  // Setting time parameters to the output frame.
71d662a922139974870f321c567b3720ac5caa3772wu@webrtc.org  // Timestamp will be reset in Scale call above, so we should set it after.
723bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  outFrame->set_timestamp(inFrame.timestamp());
733bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org  outFrame->set_render_time_ms(inFrame.render_time_ms());
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
75b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  if (ret_val == 0)
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return VPM_OK;
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  else
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return VPM_SCALE_ERROR;
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
81b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VPMSimpleSpatialResampler::TargetHeight() {
82b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return target_height_;
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
85b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgint32_t VPMSimpleSpatialResampler::TargetWidth() {
86b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  return target_width_;
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.orgbool VPMSimpleSpatialResampler::ApplyResample(int32_t width,
90b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org                                              int32_t height) {
91b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org  if ((width == target_width_ && height == target_height_) ||
92b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org       resampling_mode_ == kNoRescaling)
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return false;
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  else
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return true;
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
98b576a696e444c2873191463dcf03de1a82a50dd4mikhal@webrtc.org}  // namespace webrtc
99