X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavformat%2Frtpdec.h;h=46b08ce925f0404f863258ad67c882e6e2b97bb0;hb=81688e68f93f3142e2093f1a3d226edaeb179992;hp=98e266a687837ce1bc552e2308cb7b5bf91b7f7d;hpb=90c784cc13f6bf21a8eb69f3b88b50c7a70f6c59;p=ffmpeg diff --git a/libavformat/rtpdec.h b/libavformat/rtpdec.h index 98e266a6878..46b08ce925f 100644 --- a/libavformat/rtpdec.h +++ b/libavformat/rtpdec.h @@ -27,12 +27,13 @@ #include "avformat.h" #include "rtp.h" #include "url.h" +#include "srtp.h" typedef struct PayloadContext PayloadContext; typedef struct RTPDynamicProtocolHandler RTPDynamicProtocolHandler; #define RTP_MIN_PACKET_LENGTH 12 -#define RTP_MAX_PACKET_LENGTH 1500 +#define RTP_MAX_PACKET_LENGTH 8192 #define RTP_REORDER_QUEUE_DEFAULT_SIZE 10 @@ -40,19 +41,16 @@ typedef struct RTPDynamicProtocolHandler RTPDynamicProtocolHandler; typedef struct RTPDemuxContext RTPDemuxContext; RTPDemuxContext *ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, - URLContext *rtpc, int payload_type, - int queue_size); + int payload_type, int queue_size); void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, RTPDynamicProtocolHandler *handler); +void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, + const char *params); int ff_rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **buf, int len); void ff_rtp_parse_close(RTPDemuxContext *s); int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s); void ff_rtp_reset_packet_queue(RTPDemuxContext *s); -int ff_rtp_get_local_rtp_port(URLContext *h); -int ff_rtp_get_local_rtcp_port(URLContext *h); - -int ff_rtp_set_remote_url(URLContext *h, const char *uri); /** * Send a dummy packet on both port pairs to set up the connection @@ -69,10 +67,13 @@ void ff_rtp_send_punch_packets(URLContext* rtp_handle); /** * some rtp servers assume client is dead if they don't hear from them... - * so we send a Receiver Report to the provided ByteIO context + * so we send a Receiver Report to the provided URLContext or AVIOContext * (we don't have access to the rtcp handle from here) */ -int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, int count); +int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd, + AVIOContext *avio, int count); +int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd, + AVIOContext *avio); // these statistics are used for rtcp receiver reports... typedef struct RTPStatistics { @@ -81,9 +82,9 @@ typedef struct RTPStatistics { uint32_t base_seq; ///< base sequence number uint32_t bad_seq; ///< last bad sequence number + 1 int probation; ///< sequence packets till source is valid - int received; ///< packets received - int expected_prior; ///< packets expected in last interval - int received_prior; ///< packets received in last interval + uint32_t received; ///< packets received + uint32_t expected_prior; ///< packets expected in last interval + uint32_t received_prior; ///< packets received in last interval uint32_t transit; ///< relative transit time for previous packet uint32_t jitter; ///< estimated jitter. } RTPStatistics; @@ -130,6 +131,7 @@ struct RTPDynamicProtocolHandler { void (*free)(PayloadContext *protocol_data); /** Parse handler for this dynamic packet */ DynamicPayloadPacketHandlerProc parse_packet; + int (*need_keyframe)(PayloadContext *context); struct RTPDynamicProtocolHandler *next; }; @@ -154,13 +156,12 @@ struct RTPDemuxContext { int64_t unwrapped_timestamp; int64_t range_start_offset; int max_payload_size; - struct MpegTSContext *ts; /* only used for MP2T payloads */ - int read_buf_index; - int read_buf_size; /* used to send back RTCP RR */ - URLContext *rtp_ctx; char hostname[256]; + int srtp_enabled; + struct SRTPContext srtp; + /** Statistics for this stream (used by RTCP receiver reports) */ RTPStatistics statistics; @@ -173,6 +174,7 @@ struct RTPDemuxContext { /* rtcp sender statistics receive */ int64_t last_rtcp_ntp_time; + int64_t last_rtcp_reception_time; int64_t first_rtcp_ntp_time; uint32_t last_rtcp_timestamp; int64_t rtcp_ts_offset; @@ -181,11 +183,10 @@ struct RTPDemuxContext { unsigned int packet_count; unsigned int octet_count; unsigned int last_octet_count; - /* buffer for partially parsed packets */ - uint8_t buf[RTP_MAX_PACKET_LENGTH]; + int64_t last_feedback_time; /* dynamic payload stuff */ - DynamicPayloadPacketHandlerProc parse_packet; + const RTPDynamicProtocolHandler *handler; PayloadContext *dynamic_protocol_context; }; @@ -199,12 +200,14 @@ RTPDynamicProtocolHandler *ff_rtp_handler_find_by_id(int id, int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size); -int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, - int (*parse_fmtp)(AVStream *stream, +int ff_parse_fmtp(AVFormatContext *s, + AVStream *stream, PayloadContext *data, const char *p, + int (*parse_fmtp)(AVFormatContext *s, + AVStream *stream, PayloadContext *data, char *attr, char *value)); -void av_register_rtp_dynamic_payload_handlers(void); +void ff_register_rtp_dynamic_payload_handlers(void); /** * Close the dynamic buffer and make a packet from it.