ffmpeg / libavformat / rtpdec.h @ 1537817e
History | View | Annotate | Download (7.5 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 |
typedef struct PayloadContext PayloadContext; |
30 |
typedef struct RTPDynamicProtocolHandler_s RTPDynamicProtocolHandler; |
31 |
|
32 |
#define RTP_MIN_PACKET_LENGTH 12 |
33 |
#define RTP_MAX_PACKET_LENGTH 1500 /* XXX: suppress this define */ |
34 |
|
35 |
#define RTP_NOTS_VALUE ((uint32_t)-1) |
36 |
|
37 |
typedef struct RTPDemuxContext RTPDemuxContext; |
38 |
RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type);
|
39 |
void rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx,
|
40 |
RTPDynamicProtocolHandler *handler); |
41 |
int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
|
42 |
const uint8_t *buf, int len); |
43 |
void rtp_parse_close(RTPDemuxContext *s);
|
44 |
#if (LIBAVFORMAT_VERSION_MAJOR <= 53) |
45 |
int rtp_get_local_port(URLContext *h);
|
46 |
#endif
|
47 |
int rtp_get_local_rtp_port(URLContext *h);
|
48 |
int rtp_get_local_rtcp_port(URLContext *h);
|
49 |
|
50 |
int rtp_set_remote_url(URLContext *h, const char *uri); |
51 |
#if (LIBAVFORMAT_VERSION_MAJOR <= 52) |
52 |
void rtp_get_file_handles(URLContext *h, int *prtp_fd, int *prtcp_fd); |
53 |
#endif
|
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 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 ByteIO context
|
71 |
* (we don't have access to the rtcp handle from here)
|
72 |
*/
|
73 |
int rtp_check_and_send_back_rr(RTPDemuxContext *s, int count); |
74 |
|
75 |
// these statistics are used for rtcp receiver reports...
|
76 |
typedef struct { |
77 |
uint16_t max_seq; ///< highest sequence number seen
|
78 |
uint32_t cycles; ///< shifted count of sequence number cycles
|
79 |
uint32_t base_seq; ///< base sequence number
|
80 |
uint32_t bad_seq; ///< last bad sequence number + 1
|
81 |
int probation; ///< sequence packets till source is valid |
82 |
int received; ///< packets received |
83 |
int expected_prior; ///< packets expected in last interval |
84 |
int received_prior; ///< packets received in last interval |
85 |
uint32_t transit; ///< relative transit time for previous packet
|
86 |
uint32_t jitter; ///< estimated jitter.
|
87 |
} RTPStatistics; |
88 |
|
89 |
#define RTP_FLAG_KEY 0x1 ///< RTP packet contains a keyframe |
90 |
#define RTP_FLAG_MARKER 0x2 ///< RTP marker bit was set for this packet |
91 |
/**
|
92 |
* Packet parsing for "private" payloads in the RTP specs.
|
93 |
*
|
94 |
* @param ctx RTSP demuxer context
|
95 |
* @param s stream context
|
96 |
* @param st stream that this packet belongs to
|
97 |
* @param pkt packet in which to write the parsed data
|
98 |
* @param timestamp pointer in which to write the timestamp of this RTP packet
|
99 |
* @param buf pointer to raw RTP packet data
|
100 |
* @param len length of buf
|
101 |
* @param flags flags from the RTP packet header (RTP_FLAG_*)
|
102 |
*/
|
103 |
typedef int (*DynamicPayloadPacketHandlerProc) (AVFormatContext *ctx, |
104 |
PayloadContext *s, |
105 |
AVStream *st, |
106 |
AVPacket * pkt, |
107 |
uint32_t *timestamp, |
108 |
const uint8_t * buf,
|
109 |
int len, int flags); |
110 |
|
111 |
struct RTPDynamicProtocolHandler_s {
|
112 |
// fields from AVRtpDynamicPayloadType_s
|
113 |
const char enc_name[50]; /* XXX: still why 50 ? ;-) */ |
114 |
enum AVMediaType codec_type;
|
115 |
enum CodecID codec_id;
|
116 |
|
117 |
// may be null
|
118 |
int (*parse_sdp_a_line) (AVFormatContext *s,
|
119 |
int st_index,
|
120 |
PayloadContext *priv_data, |
121 |
const char *line); ///< Parse the a= line from the sdp field |
122 |
PayloadContext *(*open) (void); ///< allocate any data needed by the rtp parsing for this dynamic data. |
123 |
void (*close)(PayloadContext *protocol_data); ///< free any data needed by the rtp parsing for this dynamic data. |
124 |
DynamicPayloadPacketHandlerProc parse_packet; ///< parse handler for this dynamic packet.
|
125 |
|
126 |
struct RTPDynamicProtocolHandler_s *next;
|
127 |
}; |
128 |
|
129 |
// moved out of rtp.c, because the h264 decoder needs to know about this structure..
|
130 |
struct RTPDemuxContext {
|
131 |
AVFormatContext *ic; |
132 |
AVStream *st; |
133 |
int payload_type;
|
134 |
uint32_t ssrc; |
135 |
uint16_t seq; |
136 |
uint32_t timestamp; |
137 |
uint32_t base_timestamp; |
138 |
uint32_t cur_timestamp; |
139 |
int64_t range_start_offset; |
140 |
int max_payload_size;
|
141 |
struct MpegTSContext *ts; /* only used for MP2T payloads */ |
142 |
int read_buf_index;
|
143 |
int read_buf_size;
|
144 |
/* used to send back RTCP RR */
|
145 |
URLContext *rtp_ctx; |
146 |
char hostname[256]; |
147 |
|
148 |
RTPStatistics statistics; ///< Statistics for this stream (used by RTCP receiver reports)
|
149 |
|
150 |
/* rtcp sender statistics receive */
|
151 |
int64_t last_rtcp_ntp_time; // TODO: move into statistics
|
152 |
int64_t first_rtcp_ntp_time; // TODO: move into statistics
|
153 |
uint32_t last_rtcp_timestamp; // TODO: move into statistics
|
154 |
|
155 |
/* rtcp sender statistics */
|
156 |
unsigned int packet_count; // TODO: move into statistics (outgoing) |
157 |
unsigned int octet_count; // TODO: move into statistics (outgoing) |
158 |
unsigned int last_octet_count; // TODO: move into statistics (outgoing) |
159 |
int first_packet;
|
160 |
/* buffer for output */
|
161 |
uint8_t buf[RTP_MAX_PACKET_LENGTH]; |
162 |
uint8_t *buf_ptr; |
163 |
|
164 |
/* dynamic payload stuff */
|
165 |
DynamicPayloadPacketHandlerProc parse_packet; ///< This is also copied from the dynamic protocol handler structure
|
166 |
PayloadContext *dynamic_protocol_context; ///< This is a copy from the values setup from the sdp parsing, in rtsp.c don't free me.
|
167 |
int max_frames_per_packet;
|
168 |
}; |
169 |
|
170 |
extern RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler;
|
171 |
void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler);
|
172 |
|
173 |
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. |
174 |
|
175 |
int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, |
176 |
int (*parse_fmtp)(AVStream *stream,
|
177 |
PayloadContext *data, |
178 |
char *attr, char *value)); |
179 |
|
180 |
void av_register_rtp_dynamic_payload_handlers(void); |
181 |
|
182 |
#endif /* AVFORMAT_RTPDEC_H */ |