// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MEDIA_CAST_CAST_CONFIG_H_ #define MEDIA_CAST_CAST_CONFIG_H_ #include <list> #include <string> #include <vector> #include "base/basictypes.h" #include "base/callback.h" #include "base/memory/ref_counted.h" #include "media/cast/cast_defines.h" namespace media { namespace cast { enum RtcpMode { kRtcpCompound, // Compound RTCP mode is described by RFC 4585. kRtcpReducedSize, // Reduced-size RTCP mode is described by RFC 5506. }; enum VideoCodec { kVp8, kH264, kExternalVideo, }; enum AudioCodec { kOpus, kPcm16, kExternalAudio, }; struct AudioSenderConfig { AudioSenderConfig(); uint32 sender_ssrc; uint32 incoming_feedback_ssrc; int rtcp_interval; std::string rtcp_c_name; RtcpMode rtcp_mode; int rtp_history_ms; // The time RTP packets are stored for retransmissions. int rtp_max_delay_ms; int rtp_payload_type; bool use_external_encoder; int frequency; int channels; int bitrate; // Set to <= 0 for "auto variable bitrate" (libopus knows best). AudioCodec codec; std::string aes_key; // Binary string of size kAesKeySize. std::string aes_iv_mask; // Binary string of size kAesKeySize. }; struct VideoSenderConfig { VideoSenderConfig(); uint32 sender_ssrc; uint32 incoming_feedback_ssrc; int rtcp_interval; std::string rtcp_c_name; RtcpMode rtcp_mode; int rtp_history_ms; // The time RTP packets are stored for retransmissions. int rtp_max_delay_ms; int rtp_payload_type; bool use_external_encoder; int width; // Incoming frames will be scaled to this size. int height; float congestion_control_back_off; int max_bitrate; int min_bitrate; int start_bitrate; int max_qp; int min_qp; int max_frame_rate; int max_number_of_video_buffers_used; // Max value depend on codec. VideoCodec codec; int number_of_cores; std::string aes_key; // Binary string of size kAesKeySize. std::string aes_iv_mask; // Binary string of size kAesKeySize. }; struct AudioReceiverConfig { AudioReceiverConfig(); uint32 feedback_ssrc; uint32 incoming_ssrc; int rtcp_interval; std::string rtcp_c_name; RtcpMode rtcp_mode; // The time the receiver is prepared to wait for retransmissions. int rtp_max_delay_ms; int rtp_payload_type; bool use_external_decoder; int frequency; int channels; AudioCodec codec; std::string aes_key; // Binary string of size kAesKeySize. std::string aes_iv_mask; // Binary string of size kAesKeySize. }; struct VideoReceiverConfig { VideoReceiverConfig(); uint32 feedback_ssrc; uint32 incoming_ssrc; int rtcp_interval; std::string rtcp_c_name; RtcpMode rtcp_mode; // The time the receiver is prepared to wait for retransmissions. int rtp_max_delay_ms; int rtp_payload_type; bool use_external_decoder; int max_frame_rate; // Some HW decoders can not run faster than the frame rate, preventing it // from catching up after a glitch. bool decoder_faster_than_max_frame_rate; VideoCodec codec; std::string aes_key; // Binary string of size kAesKeySize. std::string aes_iv_mask; // Binary string of size kAesKeySize. }; struct EncodedVideoFrame { EncodedVideoFrame(); ~EncodedVideoFrame(); VideoCodec codec; bool key_frame; uint32 frame_id; uint32 last_referenced_frame_id; std::string data; }; // DEPRECATED: Do not use in new code. Please migrate existing code to use // media::AudioBus. struct PcmAudioFrame { PcmAudioFrame(); ~PcmAudioFrame(); int channels; // Samples in interleaved stereo format. L0, R0, L1 ,R1 ,... int frequency; std::vector<int16> samples; }; struct EncodedAudioFrame { EncodedAudioFrame(); ~EncodedAudioFrame(); AudioCodec codec; uint32 frame_id; // Needed to release the frame. int samples; // Needed send side to advance the RTP timestamp. // Not used receive side. // Support for max sampling rate of 48KHz, 2 channels, 100 ms duration. static const int kMaxNumberOfSamples = 48 * 2 * 100; std::string data; }; typedef std::vector<uint8> Packet; typedef std::vector<Packet> PacketList; class PacketSender { public: // All packets to be sent to the network will be delivered via these // functions. virtual bool SendPackets(const PacketList& packets) = 0; virtual bool SendPacket(const Packet& packet) = 0; virtual ~PacketSender() {} }; class PacketReceiver : public base::RefCountedThreadSafe<PacketReceiver> { public: // All packets received from the network should be delivered via this // function. virtual void ReceivedPacket(const uint8* packet, size_t length, const base::Closure callback) = 0; static void DeletePacket(const uint8* packet); protected: virtual ~PacketReceiver() {} private: friend class base::RefCountedThreadSafe<PacketReceiver>; }; class VideoEncoderController { public: // Inform the encoder about the new target bit rate. virtual void SetBitRate(int new_bit_rate) = 0; // Inform the encoder to not encode the next frame. // Note: this setting is sticky and should last until called with false. virtual void SkipNextFrame(bool skip_next_frame) = 0; // Inform the encoder to encode the next frame as a key frame. virtual void GenerateKeyFrame() = 0; // Inform the encoder to only reference frames older or equal to frame_id; virtual void LatestFrameIdToReference(uint32 frame_id) = 0; // Query the codec about how many frames it has skipped due to slow ACK. virtual int NumberOfSkippedFrames() const = 0; protected: virtual ~VideoEncoderController() {} }; } // namespace cast } // namespace media #endif // MEDIA_CAST_CAST_CONFIG_H_