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