/*
 *  Copyright (c) 2015 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_LAYER_FILTERING_TRANSPORT_H_
#define TEST_LAYER_FILTERING_TRANSPORT_H_

#include <stddef.h>
#include <stdint.h>

#include <map>
#include <memory>

#include "api/call/transport.h"
#include "api/media_types.h"
#include "call/call.h"
#include "call/simulated_packet_receiver.h"
#include "modules/rtp_rtcp/source/video_rtp_depacketizer.h"
#include "test/direct_transport.h"

namespace webrtc {

namespace test {

class LayerFilteringTransport : public test::DirectTransport {
 public:
  LayerFilteringTransport(
      TaskQueueBase* task_queue,
      std::unique_ptr<SimulatedPacketReceiverInterface> pipe,
      Call* send_call,
      uint8_t vp8_video_payload_type,
      uint8_t vp9_video_payload_type,
      int selected_tl,
      int selected_sl,
      const std::map<uint8_t, MediaType>& payload_type_map,
      uint32_t ssrc_to_filter_min,
      uint32_t ssrc_to_filter_max,
      rtc::ArrayView<const RtpExtension> audio_extensions,
      rtc::ArrayView<const RtpExtension> video_extensions);
  LayerFilteringTransport(
      TaskQueueBase* task_queue,
      std::unique_ptr<SimulatedPacketReceiverInterface> pipe,
      Call* send_call,
      uint8_t vp8_video_payload_type,
      uint8_t vp9_video_payload_type,
      int selected_tl,
      int selected_sl,
      const std::map<uint8_t, MediaType>& payload_type_map,
      rtc::ArrayView<const RtpExtension> audio_extensions,
      rtc::ArrayView<const RtpExtension> video_extensions);
  bool DiscardedLastPacket() const;
  bool SendRtp(rtc::ArrayView<const uint8_t> data,
               const PacketOptions& options) override;

 private:
  // Used to distinguish between VP8 and VP9.
  const uint8_t vp8_video_payload_type_;
  const uint8_t vp9_video_payload_type_;
  const std::unique_ptr<VideoRtpDepacketizer> vp8_depacketizer_;
  const std::unique_ptr<VideoRtpDepacketizer> vp9_depacketizer_;
  // Discard or invalidate all temporal/spatial layers with id greater than the
  // selected one. -1 to disable filtering.
  const int selected_tl_;
  const int selected_sl_;
  bool discarded_last_packet_;
  int num_active_spatial_layers_;
  const uint32_t ssrc_to_filter_min_;
  const uint32_t ssrc_to_filter_max_;
};

}  // namespace test
}  // namespace webrtc

#endif  // TEST_LAYER_FILTERING_TRANSPORT_H_
