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