ffmpeg / libavformat / rtpdec.h @ da9e6c42
History | View | Annotate | Download (7.97 KB)
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 |
#ifndef AVFORMAT_RTPDEC_H
|
23 |
#define AVFORMAT_RTPDEC_H
|
24 |
|
25 |
#include "libavcodec/avcodec.h" |
26 |
#include "avformat.h" |
27 |
#include "rtp.h" |
28 |
|
29 |
/** Structure listing useful vars to parse RTP packet payload*/
|
30 |
typedef struct rtp_payload_data |
31 |
{ |
32 |
int sizelength;
|
33 |
int indexlength;
|
34 |
int indexdeltalength;
|
35 |
int profile_level_id;
|
36 |
int streamtype;
|
37 |
int objecttype;
|
38 |
char *mode;
|
39 |
|
40 |
/** mpeg 4 AU headers */
|
41 |
struct AUHeaders {
|
42 |
int size;
|
43 |
int index;
|
44 |
int cts_flag;
|
45 |
int cts;
|
46 |
int dts_flag;
|
47 |
int dts;
|
48 |
int rap_flag;
|
49 |
int streamstate;
|
50 |
} *au_headers; |
51 |
int au_headers_allocated;
|
52 |
int nb_au_headers;
|
53 |
int au_headers_length_bytes;
|
54 |
int cur_au_index;
|
55 |
} RTPPayloadData; |
56 |
|
57 |
typedef struct PayloadContext PayloadContext; |
58 |
typedef struct RTPDynamicProtocolHandler_s RTPDynamicProtocolHandler; |
59 |
|
60 |
#define RTP_MIN_PACKET_LENGTH 12 |
61 |
#define RTP_MAX_PACKET_LENGTH 1500 /* XXX: suppress this define */ |
62 |
|
63 |
typedef struct RTPDemuxContext RTPDemuxContext; |
64 |
RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, RTPPayloadData *rtp_payload_data);
|
65 |
void rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx,
|
66 |
RTPDynamicProtocolHandler *handler); |
67 |
int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
|
68 |
const uint8_t *buf, int len); |
69 |
void rtp_parse_close(RTPDemuxContext *s);
|
70 |
#if (LIBAVFORMAT_VERSION_MAJOR <= 53) |
71 |
int rtp_get_local_port(URLContext *h);
|
72 |
#endif
|
73 |
int rtp_get_local_rtp_port(URLContext *h);
|
74 |
int rtp_get_local_rtcp_port(URLContext *h);
|
75 |
|
76 |
int rtp_set_remote_url(URLContext *h, const char *uri); |
77 |
#if (LIBAVFORMAT_VERSION_MAJOR <= 52) |
78 |
void rtp_get_file_handles(URLContext *h, int *prtp_fd, int *prtcp_fd); |
79 |
#endif
|
80 |
|
81 |
/**
|
82 |
* Send a dummy packet on both port pairs to set up the connection
|
83 |
* state in potential NAT routers, so that we're able to receive
|
84 |
* packets.
|
85 |
*
|
86 |
* Note, this only works if the NAT router doesn't remap ports. This
|
87 |
* isn't a standardized procedure, but it works in many cases in practice.
|
88 |
*
|
89 |
* The same routine is used with RDT too, even if RDT doesn't use normal
|
90 |
* RTP packets otherwise.
|
91 |
*/
|
92 |
void rtp_send_punch_packets(URLContext* rtp_handle);
|
93 |
|
94 |
/**
|
95 |
* some rtp servers assume client is dead if they don't hear from them...
|
96 |
* so we send a Receiver Report to the provided ByteIO context
|
97 |
* (we don't have access to the rtcp handle from here)
|
98 |
*/
|
99 |
int rtp_check_and_send_back_rr(RTPDemuxContext *s, int count); |
100 |
|
101 |
// these statistics are used for rtcp receiver reports...
|
102 |
typedef struct { |
103 |
uint16_t max_seq; ///< highest sequence number seen
|
104 |
uint32_t cycles; ///< shifted count of sequence number cycles
|
105 |
uint32_t base_seq; ///< base sequence number
|
106 |
uint32_t bad_seq; ///< last bad sequence number + 1
|
107 |
int probation; ///< sequence packets till source is valid |
108 |
int received; ///< packets received |
109 |
int expected_prior; ///< packets expected in last interval |
110 |
int received_prior; ///< packets received in last interval |
111 |
uint32_t transit; ///< relative transit time for previous packet
|
112 |
uint32_t jitter; ///< estimated jitter.
|
113 |
} RTPStatistics; |
114 |
|
115 |
#define RTP_FLAG_KEY 0x1 ///< RTP packet contains a keyframe |
116 |
#define RTP_FLAG_MARKER 0x2 ///< RTP marker bit was set for this packet |
117 |
/**
|
118 |
* Packet parsing for "private" payloads in the RTP specs.
|
119 |
*
|
120 |
* @param ctx RTSP demuxer context
|
121 |
* @param s stream context
|
122 |
* @param st stream that this packet belongs to
|
123 |
* @param pkt packet in which to write the parsed data
|
124 |
* @param timestamp pointer in which to write the timestamp of this RTP packet
|
125 |
* @param buf pointer to raw RTP packet data
|
126 |
* @param len length of buf
|
127 |
* @param flags flags from the RTP packet header (RTP_FLAG_*)
|
128 |
*/
|
129 |
typedef int (*DynamicPayloadPacketHandlerProc) (AVFormatContext *ctx, |
130 |
PayloadContext *s, |
131 |
AVStream *st, |
132 |
AVPacket * pkt, |
133 |
uint32_t *timestamp, |
134 |
const uint8_t * buf,
|
135 |
int len, int flags); |
136 |
|
137 |
struct RTPDynamicProtocolHandler_s {
|
138 |
// fields from AVRtpDynamicPayloadType_s
|
139 |
const char enc_name[50]; /* XXX: still why 50 ? ;-) */ |
140 |
enum AVMediaType codec_type;
|
141 |
enum CodecID codec_id;
|
142 |
|
143 |
// may be null
|
144 |
int (*parse_sdp_a_line) (AVFormatContext *s,
|
145 |
int st_index,
|
146 |
PayloadContext *priv_data, |
147 |
const char *line); ///< Parse the a= line from the sdp field |
148 |
PayloadContext *(*open) (void); ///< allocate any data needed by the rtp parsing for this dynamic data. |
149 |
void (*close)(PayloadContext *protocol_data); ///< free any data needed by the rtp parsing for this dynamic data. |
150 |
DynamicPayloadPacketHandlerProc parse_packet; ///< parse handler for this dynamic packet.
|
151 |
|
152 |
struct RTPDynamicProtocolHandler_s *next;
|
153 |
}; |
154 |
|
155 |
// moved out of rtp.c, because the h264 decoder needs to know about this structure..
|
156 |
struct RTPDemuxContext {
|
157 |
AVFormatContext *ic; |
158 |
AVStream *st; |
159 |
int payload_type;
|
160 |
uint32_t ssrc; |
161 |
uint16_t seq; |
162 |
uint32_t timestamp; |
163 |
uint32_t base_timestamp; |
164 |
uint32_t cur_timestamp; |
165 |
int64_t range_start_offset; |
166 |
int max_payload_size;
|
167 |
struct MpegTSContext *ts; /* only used for MP2T payloads */ |
168 |
int read_buf_index;
|
169 |
int read_buf_size;
|
170 |
/* used to send back RTCP RR */
|
171 |
URLContext *rtp_ctx; |
172 |
char hostname[256]; |
173 |
|
174 |
RTPStatistics statistics; ///< Statistics for this stream (used by RTCP receiver reports)
|
175 |
|
176 |
/* rtcp sender statistics receive */
|
177 |
int64_t last_rtcp_ntp_time; // TODO: move into statistics
|
178 |
int64_t first_rtcp_ntp_time; // TODO: move into statistics
|
179 |
uint32_t last_rtcp_timestamp; // TODO: move into statistics
|
180 |
|
181 |
/* rtcp sender statistics */
|
182 |
unsigned int packet_count; // TODO: move into statistics (outgoing) |
183 |
unsigned int octet_count; // TODO: move into statistics (outgoing) |
184 |
unsigned int last_octet_count; // TODO: move into statistics (outgoing) |
185 |
int first_packet;
|
186 |
/* buffer for output */
|
187 |
uint8_t buf[RTP_MAX_PACKET_LENGTH]; |
188 |
uint8_t *buf_ptr; |
189 |
|
190 |
/* special infos for au headers parsing */
|
191 |
RTPPayloadData *rtp_payload_data; // TODO: Move into dynamic payload handlers
|
192 |
|
193 |
/* dynamic payload stuff */
|
194 |
DynamicPayloadPacketHandlerProc parse_packet; ///< This is also copied from the dynamic protocol handler structure
|
195 |
PayloadContext *dynamic_protocol_context; ///< This is a copy from the values setup from the sdp parsing, in rtsp.c don't free me.
|
196 |
int max_frames_per_packet;
|
197 |
}; |
198 |
|
199 |
extern RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler;
|
200 |
void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler);
|
201 |
|
202 |
int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size); ///< from rtsp.c, but used by rtp dynamic protocol handlers. |
203 |
|
204 |
void av_register_rtp_dynamic_payload_handlers(void); |
205 |
|
206 |
#endif /* AVFORMAT_RTPDEC_H */ |