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/avcodec.h"
27 #include "avformat.h"
28 #include "rtp.h"
29 #include "url.h"
30 #include "srtp.h"
31 
32 typedef struct PayloadContext PayloadContext;
34 
35 #define RTP_MIN_PACKET_LENGTH 12
36 #define RTP_MAX_PACKET_LENGTH 8192
37 
38 #define RTP_REORDER_QUEUE_DEFAULT_SIZE 500
39 
40 #define RTP_NOTS_VALUE ((uint32_t)-1)
41 
42 typedef struct RTPDemuxContext RTPDemuxContext;
44  int payload_type, int queue_size);
48  const char *params);
50  uint8_t **buf, int len);
54 
55 /**
56  * Send a dummy packet on both port pairs to set up the connection
57  * state in potential NAT routers, so that we're able to receive
58  * packets.
59  *
60  * Note, this only works if the NAT router doesn't remap ports. This
61  * isn't a standardized procedure, but it works in many cases in practice.
62  *
63  * The same routine is used with RDT too, even if RDT doesn't use normal
64  * RTP packets otherwise.
65  */
66 void ff_rtp_send_punch_packets(URLContext* rtp_handle);
67 
68 /**
69  * some rtp servers assume client is dead if they don't hear from them...
70  * so we send a Receiver Report to the provided URLContext or AVIOContext
71  * (we don't have access to the rtcp handle from here)
72  */
74  AVIOContext *avio, int count);
76  AVIOContext *avio);
77 
78 // these statistics are used for rtcp receiver reports...
79 typedef struct RTPStatistics {
80  uint16_t max_seq; ///< highest sequence number seen
81  uint32_t cycles; ///< shifted count of sequence number cycles
82  uint32_t base_seq; ///< base sequence number
83  uint32_t bad_seq; ///< last bad sequence number + 1
84  int probation; ///< sequence packets till source is valid
85  uint32_t received; ///< packets received
86  uint32_t expected_prior; ///< packets expected in last interval
87  uint32_t received_prior; ///< packets received in last interval
88  uint32_t transit; ///< relative transit time for previous packet
89  uint32_t jitter; ///< estimated jitter.
91 
92 #define RTP_FLAG_KEY 0x1 ///< RTP packet contains a keyframe
93 #define RTP_FLAG_MARKER 0x2 ///< RTP marker bit was set for this packet
94 /**
95  * Packet parsing for "private" payloads in the RTP specs.
96  *
97  * @param ctx RTSP demuxer context
98  * @param s stream context
99  * @param st stream that this packet belongs to
100  * @param pkt packet in which to write the parsed data
101  * @param timestamp pointer to the RTP timestamp of the input data, can be
102  * updated by the function if returning older, buffered data
103  * @param buf pointer to raw RTP packet data
104  * @param len length of buf
105  * @param seq RTP sequence number of the packet
106  * @param flags flags from the RTP packet header (RTP_FLAG_*)
107  */
109  PayloadContext *s,
110  AVStream *st, AVPacket *pkt,
111  uint32_t *timestamp,
112  const uint8_t * buf,
113  int len, uint16_t seq, int flags);
114 
116  const char *enc_name;
119  enum AVStreamParseType need_parsing;
120  int static_payload_id; /* 0 means no payload id is set. 0 is a valid
121  * payload ID (PCMU), too, but that format doesn't
122  * require any custom depacketization code. */
124 
125  /** Initialize dynamic protocol handler, called after the full rtpmap line is parsed, may be null */
126  int (*init)(AVFormatContext *s, int st_index, PayloadContext *priv_data);
127  /** Parse the a= line from the sdp field */
128  int (*parse_sdp_a_line)(AVFormatContext *s, int st_index,
129  PayloadContext *priv_data, const char *line);
130  /** Free any data needed by the rtp parsing for this dynamic data.
131  * Don't free the protocol_data pointer itself, that is freed by the
132  * caller. This is called even if the init method failed. */
133  void (*close)(PayloadContext *protocol_data);
134  /** Parse handler for this dynamic packet */
136  int (*need_keyframe)(PayloadContext *context);
137 
139 };
140 
141 typedef struct RTPPacket {
142  uint16_t seq;
144  int len;
145  int64_t recvtime;
146  struct RTPPacket *next;
147 } RTPPacket;
148 
153  uint32_t ssrc;
154  uint16_t seq;
155  uint32_t timestamp;
156  uint32_t base_timestamp;
160  /* used to send back RTCP RR */
161  char hostname[256];
162 
164  struct SRTPContext srtp;
165 
166  /** Statistics for this stream (used by RTCP receiver reports) */
168 
169  /** Fields for packet reordering @{ */
170  int prev_ret; ///< The return value of the actual parsing of the previous packet
171  RTPPacket* queue; ///< A sorted queue of buffered packets not yet returned
172  int queue_len; ///< The number of packets in queue
173  int queue_size; ///< The size of queue, or 0 if reordering is disabled
174  /*@}*/
175 
176  /* rtcp sender statistics receive */
181  int64_t rtcp_ts_offset;
182 
183  /* rtcp sender statistics */
184  unsigned int packet_count;
185  unsigned int octet_count;
186  unsigned int last_octet_count;
188 
189  /* dynamic payload stuff */
192 };
193 
194 /**
195  * Iterate over all registered rtp dynamic protocol handlers.
196  *
197  * @param opaque a pointer where libavformat will store the iteration state. Must
198  * point to NULL to start the iteration.
199  *
200  * @return the next registered rtp dynamic protocol handler or NULL when the iteration is
201  * finished
202  */
204 /**
205  * Find a registered rtp dynamic protocol handler with the specified name.
206  *
207  * @param name name of the requested rtp dynamic protocol handler
208  * @return A rtp dynamic protocol handler if one was found, NULL otherwise.
209  */
211  enum AVMediaType codec_type);
212 /**
213  * Find a registered rtp dynamic protocol handler with a matching codec ID.
214  *
215  * @param id AVCodecID of the requested rtp dynamic protocol handler.
216  * @return A rtp dynamic protocol handler if one was found, NULL otherwise.
217  */
219  enum AVMediaType codec_type);
220 
221 /* from rtsp.c, but used by rtp dynamic protocol handlers. */
222 int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size,
223  char *value, int value_size);
224 
226  AVStream *stream, PayloadContext *data, const char *p,
227  int (*parse_fmtp)(AVFormatContext *s,
228  AVStream *stream,
229  PayloadContext *data,
230  const char *attr, const char *value));
231 
232 /**
233  * Close the dynamic buffer and make a packet from it.
234  */
235 int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx);
236 
237 #endif /* AVFORMAT_RTPDEC_H */
int queue_size
The size of queue, or 0 if reordering is disabled.
Definition: rtpdec.h:173
Bytestream IO Context.
Definition: avio.h:161
AVFormatContext * ic
Definition: rtpdec.h:150
uint16_t seq
Definition: rtpdec.h:154
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:100
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
int payload_type
Definition: rtpdec.h:152
int64_t range_start_offset
Definition: rtpdec.h:158
int prev_ret
Fields for packet reordering.
Definition: rtpdec.h:170
int64_t last_feedback_time
Definition: rtpdec.h:187
RTP/JPEG specific private data.
Definition: rdt.c:83
unsigned int last_octet_count
Definition: rtpdec.h:186
RTPPacket * queue
A sorted queue of buffered packets not yet returned.
Definition: rtpdec.h:171
enum AVCodecID codec_id
Definition: qsv.c:77
static int parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *attr, const char *value)
Definition: rtpdec_latm.c:131
const RTPDynamicProtocolHandler * handler
Definition: rtpdec.h:190
enum AVMediaType codec_type
Definition: rtp.c:37
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
Definition: rtpdec.c:755
static AVPacket pkt
uint64_t last_rtcp_ntp_time
Definition: rtpdec.h:177
uint32_t cycles
shifted count of sequence number cycles
Definition: rtpdec.h:81
int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio)
Definition: rtpdec.c:470
PayloadContext * dynamic_protocol_context
Definition: rtpdec.h:191
Format I/O context.
Definition: avformat.h:1358
uint64_t first_rtcp_ntp_time
Definition: rtpdec.h:179
uint32_t base_seq
base sequence number
Definition: rtpdec.h:82
uint8_t
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:927
GLsizei GLboolean const GLfloat * value
Definition: opengl_enc.c:108
int len
Definition: rtpdec.h:144
static void handler(vbi_event *ev, void *user_data)
int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
uint32_t expected_prior
packets expected in last interval
Definition: rtpdec.h:86
int srtp_enabled
Definition: rtpdec.h:163
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:160
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: avcodec.h:215
uint16_t seq
Definition: rtpdec.h:142
int probation
sequence packets till source is valid
Definition: rtpdec.h:84
GLenum GLint * params
Definition: opengl_enc.c:113
GLsizei count
Definition: opengl_enc.c:108
DynamicPayloadPacketHandlerProc parse_packet
Parse handler for this dynamic packet.
Definition: rtpdec.h:135
int64_t rtcp_ts_offset
Definition: rtpdec.h:181
uint32_t timestamp
Definition: rtpdec.h:155
uint32_t transit
relative transit time for previous packet
Definition: rtpdec.h:88
uint32_t jitter
estimated jitter.
Definition: rtpdec.h:89
int queue_len
The number of packets in queue.
Definition: rtpdec.h:172
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
Definition: rtpdec.c:710
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:108
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:889
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
AVFormatContext * ctx
Definition: movenc.c:48
#define s(width, name)
Definition: cbs_vp9.c:257
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:146
int max_payload_size
Definition: rtpdec.h:159
RTPDemuxContext * ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type, int queue_size)
open a new RTP parse context for stream &#39;st&#39;.
Definition: rtpdec.c:538
Stream structure.
Definition: avformat.h:881
uint32_t received
packets received
Definition: rtpdec.h:85
int64_t last_rtcp_reception_time
Definition: rtpdec.h:178
Libavcodec external API header.
unsigned int packet_count
Definition: rtpdec.h:184
int64_t unwrapped_timestamp
Definition: rtpdec.h:157
uint32_t last_rtcp_timestamp
Definition: rtpdec.h:180
void ff_rtp_parse_close(RTPDemuxContext *s)
Definition: rtpdec.c:882
unsigned int octet_count
Definition: rtpdec.h:185
void * buf
Definition: avisynth_c.h:766
Definition: url.h:38
RTPStatistics statistics
Statistics for this stream (used by RTCP receiver reports)
Definition: rtpdec.h:167
uint32_t received_prior
packets received in last interval
Definition: rtpdec.h:87
uint32_t bad_seq
last bad sequence number + 1
Definition: rtpdec.h:83
AVMediaType
Definition: avutil.h:199
#define s1
Definition: regdef.h:38
uint16_t max_seq
highest sequence number seen
Definition: rtpdec.h:80
const char * enc_name
Definition: rtpdec.h:116
uint8_t * buf
Definition: rtpdec.h:143
#define flags(name, subs,...)
Definition: cbs_av1.c:561
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, const char *params)
Definition: rtpdec.c:581
Main libavformat public API header.
int
struct RTPPacket * next
Definition: rtpdec.h:146
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:33
uint32_t ssrc
Definition: rtpdec.h:153
int64_t recvtime
Definition: rtpdec.h:145
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:869
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:402
AVStreamParseType
Definition: avformat.h:798
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, const RTPDynamicProtocolHandler *handler)
Definition: rtpdec.c:574
uint32_t base_timestamp
Definition: rtpdec.h:156
int len
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:1
unbuffered private I/O API
const RTPDynamicProtocolHandler * ff_rtp_handler_iterate(void **opaque)
Iterate over all registered rtp dynamic protocol handlers.
Definition: rtpdec.c:135
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 local context
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&#39;t hear from them...
Definition: rtpdec.c:299
AVStream * st
Definition: rtpdec.h:151
This structure stores compressed data.
Definition: avcodec.h:1457
const char * name
Definition: opengl_enc.c:102
struct RTPDynamicProtocolHandler * next
Definition: rtpdec.h:138