/*
 *  Copyright (c) 2017 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.
 */
#ifndef TEST_VIDEO_CODEC_SETTINGS_H_
#define TEST_VIDEO_CODEC_SETTINGS_H_

#include "api/video_codecs/video_encoder.h"

namespace webrtc {
namespace test {

const uint16_t kTestWidth = 352;
const uint16_t kTestHeight = 288;
const uint32_t kTestFrameRate = 30;
const unsigned int kTestMinBitrateKbps = 30;
const unsigned int kTestStartBitrateKbps = 300;
const uint8_t kTestPayloadType = 100;
const int64_t kTestTimingFramesDelayMs = 200;
const uint16_t kTestOutlierFrameSizePercent = 250;

static void CodecSettings(VideoCodecType codec_type, VideoCodec* settings) {
  memset(settings, 0, sizeof(VideoCodec));

  settings->plType = kTestPayloadType;

  settings->width = kTestWidth;
  settings->height = kTestHeight;

  settings->startBitrate = kTestStartBitrateKbps;
  settings->maxBitrate = 0;
  settings->minBitrate = kTestMinBitrateKbps;

  settings->maxFramerate = kTestFrameRate;

  settings->active = true;

  settings->qpMax = 56;  // See webrtcvideoengine.h.
  settings->numberOfSimulcastStreams = 0;

  settings->timing_frame_thresholds = {
      kTestTimingFramesDelayMs,
      kTestOutlierFrameSizePercent,
  };

  settings->codecType = codec_type;
  switch (codec_type) {
    case kVideoCodecVP8:
      *(settings->VP8()) = VideoEncoder::GetDefaultVp8Settings();
      return;
    case kVideoCodecVP9:
      *(settings->VP9()) = VideoEncoder::GetDefaultVp9Settings();
      return;
    case kVideoCodecH264:
      // TODO(brandtr): Set |qpMax| here, when the OpenH264 wrapper supports it.
      *(settings->H264()) = VideoEncoder::GetDefaultH264Settings();
      return;
    default:
      return;
  }
}
}  // namespace test
}  // namespace webrtc

#endif  // TEST_VIDEO_CODEC_SETTINGS_H_
