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