FFmpeg
rtpdec.h
Go to the documentation of this file.
1 /*
2  * RTP demuxer definitions
3  * Copyright (c) 2002 Fabrice Bellard
4  * Copyright (c) 2006 Ryan Martell <rdm4@martellventures.com>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #ifndef AVFORMAT_RTPDEC_H
24 #define AVFORMAT_RTPDEC_H
25 
26 #include "libavcodec/codec_id.h"
27 #include "libavcodec/packet.h"
28 #include "avformat.h"
29 #include "rtp.h"
30 #include "url.h"
31 #include "srtp.h"
32 
33 typedef struct PayloadContext PayloadContext;
35 
36 #define RTP_MIN_PACKET_LENGTH 12
37 #define RTP_MAX_PACKET_LENGTH 8192
38 
39 #define RTP_REORDER_QUEUE_DEFAULT_SIZE 500
40 
41 #define RTP_NOTS_VALUE ((uint32_t)-1)
42 
43 typedef struct RTPDemuxContext RTPDemuxContext;
45  int payload_type, int queue_size);
49  const char *params);
51  uint8_t **buf, int len);
55 
56 /**
57  * Send a dummy packet on both port pairs to set up the connection
58  * state in potential NAT routers, so that we're able to receive
59  * packets.
60  *
61  * Note, this only works if the NAT router doesn't remap ports. This
62  * isn't a standardized procedure, but it works in many cases in practice.
63  *
64  * The same routine is used with RDT too, even if RDT doesn't use normal
65  * RTP packets otherwise.
66  */
67 void ff_rtp_send_punch_packets(URLContext* rtp_handle);
68 
69 /**
70  * some rtp servers assume client is dead if they don't hear from them...
71  * so we send a Receiver Report to the provided URLContext or AVIOContext
72  * (we don't have access to the rtcp handle from here)
73  */
75  AVIOContext *avio, int count);
77  AVIOContext *avio);
78 
79 // these statistics are used for rtcp receiver reports...
80 typedef struct RTPStatistics {
81  uint16_t max_seq; ///< highest sequence number seen
82  uint32_t cycles; ///< shifted count of sequence number cycles
83  uint32_t base_seq; ///< base sequence number
84  uint32_t bad_seq; ///< last bad sequence number + 1
85  int probation; ///< sequence packets till source is valid
86  uint32_t received; ///< packets received
87  uint32_t expected_prior; ///< packets expected in last interval
88  uint32_t received_prior; ///< packets received in last interval
89  uint32_t transit; ///< relative transit time for previous packet
90  uint32_t jitter; ///< estimated jitter.
92 
93 #define RTP_FLAG_KEY 0x1 ///< RTP packet contains a keyframe
94 #define RTP_FLAG_MARKER 0x2 ///< RTP marker bit was set for this packet
95 /**
96  * Packet parsing for "private" payloads in the RTP specs.
97  *
98  * @param ctx RTSP demuxer context
99  * @param s stream context
100  * @param st stream that this packet belongs to
101  * @param pkt packet in which to write the parsed data
102  * @param timestamp pointer to the RTP timestamp of the input data, can be
103  * updated by the function if returning older, buffered data
104  * @param buf pointer to raw RTP packet data
105  * @param len length of buf
106  * @param seq RTP sequence number of the packet
107  * @param flags flags from the RTP packet header (RTP_FLAG_*)
108  */
110  PayloadContext *s,
111  AVStream *st, AVPacket *pkt,
112  uint32_t *timestamp,
113  const uint8_t * buf,
114  int len, uint16_t seq, int flags);
115 
117  const char *enc_name;
121  int static_payload_id; /* 0 means no payload id is set. 0 is a valid
122  * payload ID (PCMU), too, but that format doesn't
123  * require any custom depacketization code. */
125 
126  /** Initialize dynamic protocol handler, called after the full rtpmap line is parsed, may be null */
127  int (*init)(AVFormatContext *s, int st_index, PayloadContext *priv_data);
128  /** Parse the a= line from the sdp field */
130  PayloadContext *priv_data, const char *line);
131  /** Free any data needed by the rtp parsing for this dynamic data.
132  * Don't free the protocol_data pointer itself, that is freed by the
133  * caller. This is called even if the init method failed. */
134  void (*close)(PayloadContext *protocol_data);
135  /** Parse handler for this dynamic packet */
138 };
139 
140 typedef struct RTPPacket {
141  uint16_t seq;
142  uint8_t *buf;
143  int len;
145  struct RTPPacket *next;
146 } RTPPacket;
147 
152  uint32_t ssrc;
153  uint16_t seq;
154  uint32_t timestamp;
155  uint32_t base_timestamp;
159  /* used to send back RTCP RR */
160  char hostname[256];
161 
164 
165  /** Statistics for this stream (used by RTCP receiver reports) */
167 
168  /** Fields for packet reordering @{ */
169  int prev_ret; ///< The return value of the actual parsing of the previous packet
170  RTPPacket* queue; ///< A sorted queue of buffered packets not yet returned
171  int queue_len; ///< The number of packets in queue
172  int queue_size; ///< The size of queue, or 0 if reordering is disabled
173  /*@}*/
174 
175  /* rtcp sender statistics receive */
181 
182  /* rtcp sender statistics */
183  unsigned int packet_count;
184  unsigned int octet_count;
185  unsigned int last_octet_count;
187 
188  /* dynamic payload stuff */
191 };
192 
193 /**
194  * Find a registered rtp dynamic protocol handler with the specified name.
195  *
196  * @param name name of the requested rtp dynamic protocol handler
197  * @return A rtp dynamic protocol handler if one was found, NULL otherwise.
198  */
200  enum AVMediaType codec_type);
201 /**
202  * Find a registered rtp dynamic protocol handler with a matching codec ID.
203  *
204  * @param id AVCodecID of the requested rtp dynamic protocol handler.
205  * @return A rtp dynamic protocol handler if one was found, NULL otherwise.
206  */
208  enum AVMediaType codec_type);
209 
210 /* from rtsp.c, but used by rtp dynamic protocol handlers. */
211 int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size,
212  char *value, int value_size);
213 
215  AVStream *stream, PayloadContext *data, const char *p,
216  int (*parse_fmtp)(AVFormatContext *s,
217  AVStream *stream,
219  const char *attr, const char *value));
220 
221 /**
222  * Close the dynamic buffer and make a packet from it.
223  */
224 int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx);
225 
226 #endif /* AVFORMAT_RTPDEC_H */
RTPDynamicProtocolHandler::init
int(* init)(AVFormatContext *s, int st_index, PayloadContext *priv_data)
Initialize dynamic protocol handler, called after the full rtpmap line is parsed, may be null.
Definition: rtpdec.h:127
RTPStatistics
Definition: rtpdec.h:80
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
RTPStatistics::expected_prior
uint32_t expected_prior
packets expected in last interval
Definition: rtpdec.h:87
RTPDynamicProtocolHandler::parse_sdp_a_line
int(* parse_sdp_a_line)(AVFormatContext *s, int st_index, PayloadContext *priv_data, const char *line)
Parse the a= line from the sdp field.
Definition: rtpdec.h:129
ff_rtp_parse_set_crypto
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, const char *params)
Definition: rtpdec.c:627
RTPDynamicProtocolHandler::parse_packet
DynamicPayloadPacketHandlerProc parse_packet
Parse handler for this dynamic packet.
Definition: rtpdec.h:136
RTPDemuxContext::hostname
char hostname[256]
Definition: rtpdec.h:160
parse_fmtp
static int parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *attr, const char *value)
Definition: rtpdec_latm.c:132
RTPDemuxContext::handler
const RTPDynamicProtocolHandler * handler
Definition: rtpdec.h:189
int64_t
long long int64_t
Definition: coverity.c:34
RTPDemuxContext::srtp
struct SRTPContext srtp
Definition: rtpdec.h:163
srtp.h
RTPDemuxContext::range_start_offset
int64_t range_start_offset
Definition: rtpdec.h:157
ff_rtp_reset_packet_queue
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
Definition: rtpdec.c:780
data
const char data[16]
Definition: mxf.c:148
SRTPContext
Definition: srtp.h:30
codec_type
enum AVMediaType codec_type
Definition: rtp.c:37
RTPDynamicProtocolHandler::codec_id
enum AVCodecID codec_id
Definition: rtpdec.h:119
RTPDynamicProtocolHandler::enc_name
const char * enc_name
Definition: rtpdec.h:117
ff_rtp_handler_find_by_name
const RTPDynamicProtocolHandler * ff_rtp_handler_find_by_name(const char *name, enum AVMediaType codec_type)
Find a registered rtp dynamic protocol handler with the specified name.
Definition: rtpdec.c:158
RTPStatistics::cycles
uint32_t cycles
shifted count of sequence number cycles
Definition: rtpdec.h:82
RTPDemuxContext::queue_size
int queue_size
The size of queue, or 0 if reordering is disabled.
Definition: rtpdec.h:172
RTPPacket::recvtime
int64_t recvtime
Definition: rtpdec.h:144
AVStreamParseType
AVStreamParseType
Definition: avformat.h:591
RTPDynamicProtocolHandler::close
void(* close)(PayloadContext *protocol_data)
Free any data needed by the rtp parsing for this dynamic data.
Definition: rtpdec.h:134
RTPPacket::buf
uint8_t * buf
Definition: rtpdec.h:142
RTPDynamicProtocolHandler::priv_data_size
int priv_data_size
Definition: rtpdec.h:124
ff_rtp_parse_set_dynamic_protocol
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, const RTPDynamicProtocolHandler *handler)
Definition: rtpdec.c:620
RTPStatistics::jitter
uint32_t jitter
estimated jitter.
Definition: rtpdec.h:90
pkt
AVPacket * pkt
Definition: movenc.c:59
ff_rtp_parse_close
void ff_rtp_parse_close(RTPDemuxContext *s)
Definition: rtpdec.c:957
codec_id.h
RTPDemuxContext::dynamic_protocol_context
PayloadContext * dynamic_protocol_context
Definition: rtpdec.h:190
RTPDemuxContext::payload_type
int payload_type
Definition: rtpdec.h:151
s
#define s(width, name)
Definition: cbs_vp9.c:198
RTPPacket::next
struct RTPPacket * next
Definition: rtpdec.h:145
RTPStatistics::received
uint32_t received
packets received
Definition: rtpdec.h:86
RTPDemuxContext::statistics
RTPStatistics statistics
Statistics for this stream (used by RTCP receiver reports)
Definition: rtpdec.h:166
s1
#define s1
Definition: regdef.h:38
RTPDemuxContext::last_rtcp_reception_time
int64_t last_rtcp_reception_time
Definition: rtpdec.h:177
RTPDemuxContext::queue
RTPPacket * queue
A sorted queue of buffered packets not yet returned.
Definition: rtpdec.h:170
ctx
AVFormatContext * ctx
Definition: movenc.c:48
ff_rtp_check_and_send_back_rr
int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio, int count)
some rtp servers assume client is dead if they don't hear from them...
Definition: rtpdec.c:311
handler
static void handler(vbi_event *ev, void *user_data)
Definition: libzvbi-teletextdec.c:508
context
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option keep it simple and lowercase description are in without and describe what they for example set the foo of the bar offset is the offset of the field in your context
Definition: writing_filters.txt:91
AVFormatContext
Format I/O context.
Definition: avformat.h:1255
RTPDemuxContext::last_feedback_time
int64_t last_feedback_time
Definition: rtpdec.h:186
ff_rtsp_next_attr_and_value
int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
RTPDemuxContext::queue_len
int queue_len
The number of packets in queue.
Definition: rtpdec.h:171
RTPStatistics::bad_seq
uint32_t bad_seq
last bad sequence number + 1
Definition: rtpdec.h:84
RTPDemuxContext::rtcp_ts_offset
int64_t rtcp_ts_offset
Definition: rtpdec.h:180
RTPDemuxContext::srtp_enabled
int srtp_enabled
Definition: rtpdec.h:162
RTPDemuxContext::last_rtcp_ntp_time
uint64_t last_rtcp_ntp_time
Definition: rtpdec.h:176
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
RTPPacket
Definition: rtpdec.h:140
suite
FFmpeg currently uses a custom build this text attempts to document some of its obscure features and options Makefile the full command issued by make and its output will be shown on the screen DBG Preprocess x86 external assembler files to a dbg asm file in the object which then gets compiled Helps in developing those assembler files DESTDIR Destination directory for the install useful to prepare packages or install FFmpeg in cross environments GEN Set to ‘1’ to generate the missing or mismatched references Makefile builds all the libraries and the executables fate Run the fate test suite
Definition: build_system.txt:28
RTPStatistics::transit
uint32_t transit
relative transit time for previous packet
Definition: rtpdec.h:89
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVMediaType
AVMediaType
Definition: avutil.h:199
RTPDemuxContext::first_rtcp_ntp_time
uint64_t first_rtcp_ntp_time
Definition: rtpdec.h:178
RTPDemuxContext::packet_count
unsigned int packet_count
Definition: rtpdec.h:183
ff_rtp_finalize_packet
int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
Close the dynamic buffer and make a packet from it.
Definition: rtpdec.c:1002
RTPDemuxContext::unwrapped_timestamp
int64_t unwrapped_timestamp
Definition: rtpdec.h:156
RTPDynamicProtocolHandler::need_keyframe
int(* need_keyframe)(PayloadContext *context)
Definition: rtpdec.h:137
RTPDemuxContext::octet_count
unsigned int octet_count
Definition: rtpdec.h:184
ff_rtp_send_rtcp_feedback
int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio)
Definition: rtpdec.c:468
rtp.h
RTPStatistics::max_seq
uint16_t max_seq
highest sequence number seen
Definition: rtpdec.h:81
URLContext
Definition: url.h:35
packet.h
RTPDemuxContext::ssrc
uint32_t ssrc
Definition: rtpdec.h:152
RTPDynamicProtocolHandler::need_parsing
enum AVStreamParseType need_parsing
Definition: rtpdec.h:120
RTPDemuxContext::st
AVStream * st
Definition: rtpdec.h:150
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
url.h
RTPPacket::len
int len
Definition: rtpdec.h:143
RTPDemuxContext::max_payload_size
int max_payload_size
Definition: rtpdec.h:158
len
int len
Definition: vorbis_enc_data.h:426
RTPDemuxContext
Definition: rtpdec.h:148
RTPDemuxContext::timestamp
uint32_t timestamp
Definition: rtpdec.h:154
RTPStatistics::received_prior
uint32_t received_prior
packets received in last interval
Definition: rtpdec.h:88
DynamicPayloadPacketHandlerProc
int(* DynamicPayloadPacketHandlerProc)(AVFormatContext *ctx, PayloadContext *s, AVStream *st, AVPacket *pkt, uint32_t *timestamp, const uint8_t *buf, int len, uint16_t seq, int flags)
Packet parsing for "private" payloads in the RTP specs.
Definition: rtpdec.h:109
RTPDemuxContext::ic
AVFormatContext * ic
Definition: rtpdec.h:149
AVStream
Stream structure.
Definition: avformat.h:743
RTPDemuxContext::seq
uint16_t seq
Definition: rtpdec.h:153
avformat.h
RTPStatistics::probation
int probation
sequence packets till source is valid
Definition: rtpdec.h:85
RTPDemuxContext::base_timestamp
uint32_t base_timestamp
Definition: rtpdec.h:155
RTPDynamicProtocolHandler::codec_type
enum AVMediaType codec_type
Definition: rtpdec.h:118
ff_rtp_handler_find_by_id
const RTPDynamicProtocolHandler * ff_rtp_handler_find_by_id(int id, enum AVMediaType codec_type)
Find a registered rtp dynamic protocol handler with a matching codec ID.
Definition: rtpdec.c:172
RTPPacket::seq
uint16_t seq
Definition: rtpdec.h:141
ff_parse_fmtp
int ff_parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *p, int(*parse_fmtp)(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *attr, const char *value))
Definition: rtpdec.c:964
RTPDynamicProtocolHandler::static_payload_id
int static_payload_id
Definition: rtpdec.h:121
ff_rtp_queued_packet_time
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
Definition: rtpdec.c:825
RTPDemuxContext::last_rtcp_timestamp
uint32_t last_rtcp_timestamp
Definition: rtpdec.h:179
AVPacket
This structure stores compressed data.
Definition: packet.h:499
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
PayloadContext
RTP/JPEG specific private data.
Definition: rdt.c:84
int
int
Definition: ffmpeg_filter.c:409
RTPDemuxContext::prev_ret
int prev_ret
Fields for packet reordering.
Definition: rtpdec.h:169
ff_rtp_parse_open
RTPDemuxContext * ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type, int queue_size)
open a new RTP parse context for stream 'st'.
Definition: rtpdec.c:573
RTPStatistics::base_seq
uint32_t base_seq
base sequence number
Definition: rtpdec.h:83
line
The official guide to swscale for confused that consecutive non overlapping rectangles of slice_bottom special converter These generally are unscaled converters of common like for each output line the vertical scaler pulls lines from a ring buffer When the ring buffer does not contain the wanted line
Definition: swscale.txt:40
ff_rtp_parse_packet
int ff_rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **buf, int len)
Parse an RTP or RTCP packet directly sent as a buffer.
Definition: rtpdec.c:944
RTPDynamicProtocolHandler
Definition: rtpdec.h:116
ff_rtp_send_punch_packets
void ff_rtp_send_punch_packets(URLContext *rtp_handle)
Send a dummy packet on both port pairs to set up the connection state in potential NAT routers,...
Definition: rtpdec.c:414
RTPDemuxContext::last_octet_count
unsigned int last_octet_count
Definition: rtpdec.h:185