/*
 *  Copyright 2018 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 "api/rtp_receiver_interface.h"

namespace webrtc {

RtpSource::RtpSource(int64_t timestamp_ms,
                     uint32_t source_id,
                     RtpSourceType source_type,
                     absl::optional<uint8_t> audio_level,
                     uint32_t rtp_timestamp)
    : timestamp_ms_(timestamp_ms),
      source_id_(source_id),
      source_type_(source_type),
      audio_level_(audio_level),
      rtp_timestamp_(rtp_timestamp) {}

RtpSource::RtpSource(int64_t timestamp_ms,
                     uint32_t source_id,
                     RtpSourceType source_type)
    : timestamp_ms_(timestamp_ms),
      source_id_(source_id),
      source_type_(source_type),
      rtp_timestamp_(0) {}

RtpSource::RtpSource(int64_t timestamp_ms,
                     uint32_t source_id,
                     RtpSourceType source_type,
                     uint8_t audio_level)
    : timestamp_ms_(timestamp_ms),
      source_id_(source_id),
      source_type_(source_type),
      audio_level_(audio_level),
      rtp_timestamp_(0) {}

RtpSource::RtpSource(const RtpSource&) = default;
RtpSource& RtpSource::operator=(const RtpSource&) = default;
RtpSource::~RtpSource() = default;

std::vector<std::string> RtpReceiverInterface::stream_ids() const {
  return {};
}

std::vector<rtc::scoped_refptr<MediaStreamInterface>>
RtpReceiverInterface::streams() const {
  return {};
}

std::vector<RtpSource> RtpReceiverInterface::GetSources() const {
  return {};
}

void RtpReceiverInterface::SetFrameDecryptor(
    rtc::scoped_refptr<FrameDecryptorInterface> frame_decryptor) {}

rtc::scoped_refptr<FrameDecryptorInterface>
RtpReceiverInterface::GetFrameDecryptor() const {
  return nullptr;
}

rtc::scoped_refptr<DtlsTransportInterface>
RtpReceiverInterface::dtls_transport() const {
  return nullptr;
}

}  // namespace webrtc
