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

#include "webrtc/ortc/testrtpparameters.h"

#include <algorithm>
#include <utility>

namespace webrtc {

RtpParameters MakeMinimalOpusParameters() {
  RtpParameters parameters;
  RtpCodecParameters opus_codec;
  opus_codec.name = "opus";
  opus_codec.kind = cricket::MEDIA_TYPE_AUDIO;
  opus_codec.payload_type = 111;
  opus_codec.clock_rate.emplace(48000);
  opus_codec.num_channels.emplace(2);
  parameters.codecs.push_back(std::move(opus_codec));
  RtpEncodingParameters encoding;
  encoding.codec_payload_type.emplace(111);
  parameters.encodings.push_back(std::move(encoding));
  return parameters;
}

RtpParameters MakeMinimalIsacParameters() {
  RtpParameters parameters;
  RtpCodecParameters isac_codec;
  isac_codec.name = "ISAC";
  isac_codec.kind = cricket::MEDIA_TYPE_AUDIO;
  isac_codec.payload_type = 103;
  isac_codec.clock_rate.emplace(16000);
  parameters.codecs.push_back(std::move(isac_codec));
  RtpEncodingParameters encoding;
  encoding.codec_payload_type.emplace(111);
  parameters.encodings.push_back(std::move(encoding));
  return parameters;
}

RtpParameters MakeMinimalOpusParametersWithSsrc(uint32_t ssrc) {
  RtpParameters parameters = MakeMinimalOpusParameters();
  parameters.encodings[0].ssrc.emplace(ssrc);
  return parameters;
}

RtpParameters MakeMinimalIsacParametersWithSsrc(uint32_t ssrc) {
  RtpParameters parameters = MakeMinimalIsacParameters();
  parameters.encodings[0].ssrc.emplace(ssrc);
  return parameters;
}

RtpParameters MakeMinimalVideoParameters(const char* codec_name) {
  RtpParameters parameters;
  RtpCodecParameters vp8_codec;
  vp8_codec.name = codec_name;
  vp8_codec.kind = cricket::MEDIA_TYPE_VIDEO;
  vp8_codec.payload_type = 96;
  parameters.codecs.push_back(std::move(vp8_codec));
  RtpEncodingParameters encoding;
  encoding.codec_payload_type.emplace(96);
  parameters.encodings.push_back(std::move(encoding));
  return parameters;
}

RtpParameters MakeMinimalVp8Parameters() {
  return MakeMinimalVideoParameters("VP8");
}

RtpParameters MakeMinimalVp9Parameters() {
  return MakeMinimalVideoParameters("VP9");
}

RtpParameters MakeMinimalVp8ParametersWithSsrc(uint32_t ssrc) {
  RtpParameters parameters = MakeMinimalVp8Parameters();
  parameters.encodings[0].ssrc.emplace(ssrc);
  return parameters;
}

RtpParameters MakeMinimalVp9ParametersWithSsrc(uint32_t ssrc) {
  RtpParameters parameters = MakeMinimalVp9Parameters();
  parameters.encodings[0].ssrc.emplace(ssrc);
  return parameters;
}

// Note: Currently, these "WithNoSsrc" methods are identical to the normal
// "MakeMinimal" methods, but with the added guarantee that they will never be
// changed to include an SSRC.

RtpParameters MakeMinimalOpusParametersWithNoSsrc() {
  RtpParameters parameters = MakeMinimalOpusParameters();
  RTC_DCHECK(!parameters.encodings[0].ssrc);
  return parameters;
}

RtpParameters MakeMinimalIsacParametersWithNoSsrc() {
  RtpParameters parameters = MakeMinimalIsacParameters();
  RTC_DCHECK(!parameters.encodings[0].ssrc);
  return parameters;
}

RtpParameters MakeMinimalVp8ParametersWithNoSsrc() {
  RtpParameters parameters = MakeMinimalVp8Parameters();
  RTC_DCHECK(!parameters.encodings[0].ssrc);
  return parameters;
}

RtpParameters MakeMinimalVp9ParametersWithNoSsrc() {
  RtpParameters parameters = MakeMinimalVp9Parameters();
  RTC_DCHECK(!parameters.encodings[0].ssrc);
  return parameters;
}

// Make audio parameters with all the available properties configured and
// features used, and with multiple codecs offered. Obtained by taking a
// snapshot of a default PeerConnection offer (and adding other things, like
// bitrate limit).
//
// See "MakeFullOpusParameters"/"MakeFullIsacParameters" below.
RtpParameters MakeFullAudioParameters(int preferred_payload_type) {
  RtpParameters parameters;

  RtpCodecParameters opus_codec;
  opus_codec.name = "opus";
  opus_codec.kind = cricket::MEDIA_TYPE_AUDIO;
  opus_codec.payload_type = 111;
  opus_codec.clock_rate.emplace(48000);
  opus_codec.num_channels.emplace(2);
  opus_codec.parameters["minptime"] = "10";
  opus_codec.parameters["useinbandfec"] = "1";
  opus_codec.parameters["usedtx"] = "1";
  opus_codec.parameters["stereo"] = "1";
  opus_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
  parameters.codecs.push_back(std::move(opus_codec));

  RtpCodecParameters isac_codec;
  isac_codec.name = "ISAC";
  isac_codec.kind = cricket::MEDIA_TYPE_AUDIO;
  isac_codec.payload_type = 103;
  isac_codec.clock_rate.emplace(16000);
  parameters.codecs.push_back(std::move(isac_codec));

  RtpCodecParameters cn_codec;
  cn_codec.name = "CN";
  cn_codec.kind = cricket::MEDIA_TYPE_AUDIO;
  cn_codec.payload_type = 106;
  cn_codec.clock_rate.emplace(32000);
  parameters.codecs.push_back(std::move(cn_codec));

  RtpCodecParameters dtmf_codec;
  dtmf_codec.name = "telephone-event";
  dtmf_codec.kind = cricket::MEDIA_TYPE_AUDIO;
  dtmf_codec.payload_type = 126;
  dtmf_codec.clock_rate.emplace(8000);
  parameters.codecs.push_back(std::move(dtmf_codec));

  // "codec_payload_type" isn't implemented, so we need to reorder codecs to
  // cause one to be used.
  // TODO(deadbeef): Remove this when it becomes unnecessary.
  auto it = std::find_if(parameters.codecs.begin(), parameters.codecs.end(),
                         [preferred_payload_type](const RtpCodecParameters& p) {
                           return p.payload_type == preferred_payload_type;
                         });
  RtpCodecParameters preferred = *it;
  parameters.codecs.erase(it);
  parameters.codecs.insert(parameters.codecs.begin(), preferred);

  // Intentionally leave out SSRC so one's chosen automatically.
  RtpEncodingParameters encoding;
  encoding.codec_payload_type.emplace(preferred_payload_type);
  encoding.dtx.emplace(DtxStatus::ENABLED);
  // 20 kbps.
  encoding.max_bitrate_bps.emplace(20000);
  parameters.encodings.push_back(std::move(encoding));

  parameters.header_extensions.emplace_back(
      "urn:ietf:params:rtp-hdrext:ssrc-audio-level", 1);
  return parameters;
}

RtpParameters MakeFullOpusParameters() {
  return MakeFullAudioParameters(111);
}

RtpParameters MakeFullIsacParameters() {
  return MakeFullAudioParameters(103);
}

// Make video parameters with all the available properties configured and
// features used, and with multiple codecs offered. Obtained by taking a
// snapshot of a default PeerConnection offer (and adding other things, like
// bitrate limit).
//
// See "MakeFullVp8Parameters"/"MakeFullVp9Parameters" below.
RtpParameters MakeFullVideoParameters(int preferred_payload_type) {
  RtpParameters parameters;

  RtpCodecParameters vp8_codec;
  vp8_codec.name = "VP8";
  vp8_codec.kind = cricket::MEDIA_TYPE_VIDEO;
  vp8_codec.payload_type = 100;
  vp8_codec.clock_rate.emplace(90000);
  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM,
                                       RtcpFeedbackMessageType::FIR);
  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
                                       RtcpFeedbackMessageType::GENERIC_NACK);
  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
                                       RtcpFeedbackMessageType::PLI);
  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::REMB);
  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
  parameters.codecs.push_back(std::move(vp8_codec));

  RtpCodecParameters vp8_rtx_codec;
  vp8_rtx_codec.name = "rtx";
  vp8_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
  vp8_rtx_codec.payload_type = 96;
  vp8_rtx_codec.clock_rate.emplace(90000);
  vp8_rtx_codec.parameters["apt"] = "100";
  parameters.codecs.push_back(std::move(vp8_rtx_codec));

  RtpCodecParameters vp9_codec;
  vp9_codec.name = "VP9";
  vp9_codec.kind = cricket::MEDIA_TYPE_VIDEO;
  vp9_codec.payload_type = 101;
  vp9_codec.clock_rate.emplace(90000);
  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM,
                                       RtcpFeedbackMessageType::FIR);
  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
                                       RtcpFeedbackMessageType::GENERIC_NACK);
  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
                                       RtcpFeedbackMessageType::PLI);
  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::REMB);
  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
  parameters.codecs.push_back(std::move(vp9_codec));

  RtpCodecParameters vp9_rtx_codec;
  vp9_rtx_codec.name = "rtx";
  vp9_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
  vp9_rtx_codec.payload_type = 97;
  vp9_rtx_codec.clock_rate.emplace(90000);
  vp9_rtx_codec.parameters["apt"] = "101";
  parameters.codecs.push_back(std::move(vp9_rtx_codec));

  RtpCodecParameters red_codec;
  red_codec.name = "red";
  red_codec.kind = cricket::MEDIA_TYPE_VIDEO;
  red_codec.payload_type = 116;
  red_codec.clock_rate.emplace(90000);
  parameters.codecs.push_back(std::move(red_codec));

  RtpCodecParameters red_rtx_codec;
  red_rtx_codec.name = "rtx";
  red_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
  red_rtx_codec.payload_type = 98;
  red_rtx_codec.clock_rate.emplace(90000);
  red_rtx_codec.parameters["apt"] = "116";
  parameters.codecs.push_back(std::move(red_rtx_codec));

  RtpCodecParameters ulpfec_codec;
  ulpfec_codec.name = "ulpfec";
  ulpfec_codec.kind = cricket::MEDIA_TYPE_VIDEO;
  ulpfec_codec.payload_type = 117;
  ulpfec_codec.clock_rate.emplace(90000);
  parameters.codecs.push_back(std::move(ulpfec_codec));

  // "codec_payload_type" isn't implemented, so we need to reorder codecs to
  // cause one to be used.
  // TODO(deadbeef): Remove this when it becomes unnecessary.
  auto it = std::find_if(parameters.codecs.begin(), parameters.codecs.end(),
                         [preferred_payload_type](const RtpCodecParameters& p) {
                           return p.payload_type == preferred_payload_type;
                         });
  RtpCodecParameters preferred = *it;
  parameters.codecs.erase(it);
  parameters.codecs.insert(parameters.codecs.begin(), preferred);

  // Intentionally leave out SSRC so one's chosen automatically.
  RtpEncodingParameters encoding;
  encoding.codec_payload_type.emplace(preferred_payload_type);
  encoding.fec.emplace(FecMechanism::RED_AND_ULPFEC);
  // Will create default RtxParameters, with unset SSRC.
  encoding.rtx.emplace();
  // 100 kbps.
  encoding.max_bitrate_bps.emplace(100000);
  parameters.encodings.push_back(std::move(encoding));

  parameters.header_extensions.emplace_back(
      "urn:ietf:params:rtp-hdrext:toffset", 2);
  parameters.header_extensions.emplace_back(
      "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time", 3);
  parameters.header_extensions.emplace_back("urn:3gpp:video-orientation", 4);
  parameters.header_extensions.emplace_back(
      "http://www.ietf.org/id/"
      "draft-holmer-rmcat-transport-wide-cc-extensions-01",
      5);
  parameters.header_extensions.emplace_back(
      "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay", 6);
  return parameters;
}

RtpParameters MakeFullVp8Parameters() {
  return MakeFullVideoParameters(100);
}

RtpParameters MakeFullVp9Parameters() {
  return MakeFullVideoParameters(101);
}

}  // namespace webrtc
