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

#ifndef API_ORTC_MEDIADESCRIPTION_H_
#define API_ORTC_MEDIADESCRIPTION_H_

#include <string>
#include <utility>
#include <vector>

#include "absl/types/optional.h"
#include "api/cryptoparams.h"

namespace webrtc {

// A structured representation of a media description within an SDP session
// description.
class MediaDescription {
 public:
  explicit MediaDescription(std::string mid) : mid_(std::move(mid)) {}

  ~MediaDescription() {}

  // The mid(media stream identification) is used for identifying media streams
  // within a session description.
  // https://tools.ietf.org/html/rfc5888#section-6
  absl::optional<std::string> mid() const { return mid_; }
  void set_mid(std::string mid) { mid_.emplace(std::move(mid)); }

  // Security keys and parameters for this media stream. Can be used to
  // negotiate parameters for SRTP.
  // https://tools.ietf.org/html/rfc4568#page-5
  std::vector<cricket::CryptoParams>& sdes_params() { return sdes_params_; }
  const std::vector<cricket::CryptoParams>& sdes_params() const {
    return sdes_params_;
  }

 private:
  absl::optional<std::string> mid_;

  std::vector<cricket::CryptoParams> sdes_params_;
};

}  // namespace webrtc

#endif  // API_ORTC_MEDIADESCRIPTION_H_
