| /* |
| * 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/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 |