/*
 *  Copyright 2021 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 PC_RTP_SENDER_PROXY_H_
#define PC_RTP_SENDER_PROXY_H_

#include <cstdint>
#include <memory>
#include <string>
#include <vector>

#include "api/crypto/frame_encryptor_interface.h"
#include "api/dtls_transport_interface.h"
#include "api/dtmf_sender_interface.h"
#include "api/encoded_audio_frame_injector_interface.h"
#include "api/encoded_video_frame_injector_interface.h"
#include "api/frame_transformer_interface.h"
#include "api/media_stream_interface.h"
#include "api/media_types.h"
#include "api/rtc_error.h"
#include "api/rtp_parameters.h"
#include "api/rtp_sender_interface.h"
#include "api/scoped_refptr.h"
#include "api/sframe/sframe_encryptor_interface.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "pc/proxy.h"

namespace webrtc {

// Define proxy for RtpSenderInterface.
// TODO(deadbeef): Move this to .cc file. What threads methods are called on is
// an implementation detail.
BEGIN_PRIMARY_PROXY_MAP(RtpSender)
PROXY_PRIMARY_THREAD_DESTRUCTOR()
PROXY_METHOD1(bool, SetTrack, MediaStreamTrackInterface*)
PROXY_CONSTMETHOD0(scoped_refptr<MediaStreamTrackInterface>, track)
PROXY_CONSTMETHOD0(scoped_refptr<DtlsTransportInterface>, dtls_transport)
PROXY_CONSTMETHOD0(uint32_t, ssrc)
BYPASS_PROXY_CONSTMETHOD0(webrtc::MediaType, media_type)
BYPASS_PROXY_CONSTMETHOD0(std::string, id)
PROXY_CONSTMETHOD0(std::vector<std::string>, stream_ids)
PROXY_CONSTMETHOD0(std::vector<RtpEncodingParameters>, init_send_encodings)
PROXY_CONSTMETHOD0(RtpParameters, GetParameters)
PROXY_METHOD1(RTCError, SetParameters, const RtpParameters&)
PROXY_METHOD2(void,
              SetParametersAsync,
              const RtpParameters&,
              SetParametersCallback)
PROXY_CONSTMETHOD0(scoped_refptr<DtmfSenderInterface>, GetDtmfSender)
PROXY_METHOD1(void, SetFrameEncryptor, scoped_refptr<FrameEncryptorInterface>)
PROXY_METHOD1(void, SetObserver, RtpSenderObserverInterface*)
PROXY_CONSTMETHOD0(scoped_refptr<FrameEncryptorInterface>, GetFrameEncryptor)
PROXY_METHOD1(void, SetStreams, const std::vector<std::string>&)
PROXY_METHOD1(void,
              SetFrameTransformer,
              scoped_refptr<FrameTransformerInterface>)
PROXY_METHOD1(RTCErrorOr<scoped_refptr<SframeEncryptorInterface>>,
              CreateSframeEncryptorOrError,
              const SframeEncryptorInit&)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
PROXY_METHOD1(void,
              SetEncoderSelector,
              std::unique_ptr<VideoEncoderFactory::EncoderSelectorInterface>)
#pragma clang diagnostic pop
PROXY_METHOD1(void,
              SetEncoderSelector,
              scoped_refptr<VideoEncoderFactory::EncoderSelectorInterface>)
PROXY_METHOD1(RTCError, GenerateKeyFrame, const std::vector<std::string>&)
PROXY_METHOD2(scoped_refptr<EncodedVideoFrameInjectorInterface>,
              CreateEncodedVideoFrameInjector,
              KeyFrameCallback,
              BitrateInfoCallback)
PROXY_METHOD1(scoped_refptr<EncodedAudioFrameInjectorInterface>,
              CreateEncodedAudioFrameInjector,
              TargetBitrateCallback)
END_PROXY_MAP(RtpSender)

}  // namespace webrtc

#endif  // PC_RTP_SENDER_PROXY_H_
