FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
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
;
33
typedef
struct
RTPDynamicProtocolHandler
RTPDynamicProtocolHandler
;
34
35
#define RTP_MIN_PACKET_LENGTH 12
36
#define RTP_MAX_PACKET_LENGTH 8192
37
38
#define RTP_REORDER_QUEUE_DEFAULT_SIZE 10
39
40
#define RTP_NOTS_VALUE ((uint32_t)-1)
41
42
typedef
struct
RTPDemuxContext
RTPDemuxContext
;
43
RTPDemuxContext
*
ff_rtp_parse_open
(
AVFormatContext
*
s1
,
AVStream
*
st
,
44
int
payload_type
,
int
queue_size
);
45
void
ff_rtp_parse_set_dynamic_protocol
(
RTPDemuxContext
*
s
,
PayloadContext
*ctx,
46
RTPDynamicProtocolHandler
*
handler
);
47
void
ff_rtp_parse_set_crypto
(
RTPDemuxContext
*
s
,
const
char
*suite,
48
const
char
*
params
);
49
int
ff_rtp_parse_packet
(
RTPDemuxContext
*
s
,
AVPacket
*
pkt
,
50
uint8_t
**
buf
,
int
len
);
51
void
ff_rtp_parse_close
(
RTPDemuxContext
*
s
);
52
int64_t
ff_rtp_queued_packet_time
(
RTPDemuxContext
*
s
);
53
void
ff_rtp_reset_packet_queue
(
RTPDemuxContext
*
s
);
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
*/
73
int
ff_rtp_check_and_send_back_rr
(
RTPDemuxContext
*
s
,
URLContext
*fd,
74
AVIOContext
*avio,
int
count
);
75
int
ff_rtp_send_rtcp_feedback
(
RTPDemuxContext
*
s
,
URLContext
*fd,
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.
90
}
RTPStatistics
;
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
*/
108
typedef
int (*
DynamicPayloadPacketHandlerProc
)(
AVFormatContext
*ctx,
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
115
struct
RTPDynamicProtocolHandler
{
116
const
char
*
enc_name
;
117
enum
AVMediaType
codec_type
;
118
enum
AVCodecID
codec_id
;
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. */
123
int
priv_data_size
;
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 */
135
DynamicPayloadPacketHandlerProc
parse_packet
;
136
int (*
need_keyframe
)(
PayloadContext
*context);
137
138
struct
RTPDynamicProtocolHandler
*
next
;
139
};
140
141
typedef
struct
RTPPacket
{
142
uint16_t
seq
;
143
uint8_t
*
buf
;
144
int
len
;
145
int64_t
recvtime
;
146
struct
RTPPacket
*
next
;
147
}
RTPPacket
;
148
149
struct
RTPDemuxContext
{
150
AVFormatContext
*
ic
;
151
AVStream
*
st
;
152
int
payload_type
;
153
uint32_t
ssrc
;
154
uint16_t
seq
;
155
uint32_t
timestamp
;
156
uint32_t
base_timestamp
;
157
uint32_t
cur_timestamp
;
158
int64_t
unwrapped_timestamp
;
159
int64_t
range_start_offset
;
160
int
max_payload_size
;
161
/* used to send back RTCP RR */
162
char
hostname
[256];
163
164
int
srtp_enabled
;
165
struct
SRTPContext
srtp
;
166
167
/** Statistics for this stream (used by RTCP receiver reports) */
168
RTPStatistics
statistics
;
169
170
/** Fields for packet reordering @{ */
171
int
prev_ret
;
///< The return value of the actual parsing of the previous packet
172
RTPPacket
*
queue
;
///< A sorted queue of buffered packets not yet returned
173
int
queue_len
;
///< The number of packets in queue
174
int
queue_size
;
///< The size of queue, or 0 if reordering is disabled
175
/*@}*/
176
177
/* rtcp sender statistics receive */
178
uint64_t
last_rtcp_ntp_time
;
179
int64_t
last_rtcp_reception_time
;
180
uint64_t
first_rtcp_ntp_time
;
181
uint32_t
last_rtcp_timestamp
;
182
int64_t
rtcp_ts_offset
;
183
184
/* rtcp sender statistics */
185
unsigned
int
packet_count
;
186
unsigned
int
octet_count
;
187
unsigned
int
last_octet_count
;
188
int64_t
last_feedback_time
;
189
190
/* dynamic payload stuff */
191
const
RTPDynamicProtocolHandler
*
handler
;
192
PayloadContext
*
dynamic_protocol_context
;
193
};
194
195
void
ff_register_dynamic_payload_handler
(
RTPDynamicProtocolHandler
*
handler
);
196
RTPDynamicProtocolHandler
*
ff_rtp_handler_find_by_name
(
const
char
*
name
,
197
enum
AVMediaType
codec_type
);
198
RTPDynamicProtocolHandler
*
ff_rtp_handler_find_by_id
(
int
id
,
199
enum
AVMediaType
codec_type
);
200
201
/* from rtsp.c, but used by rtp dynamic protocol handlers. */
202
int
ff_rtsp_next_attr_and_value
(
const
char
**p,
char
*attr,
int
attr_size,
203
char
*
value
,
int
value_size);
204
205
int
ff_parse_fmtp
(
AVFormatContext
*
s
,
206
AVStream
*stream,
PayloadContext
*
data
,
const
char
*p,
207
int
(*
parse_fmtp
)(
AVFormatContext
*s,
208
AVStream
*stream,
209
PayloadContext
*data,
210
const
char
*attr,
const
char
*
value
));
211
212
void
ff_register_rtp_dynamic_payload_handlers
(
void
);
213
214
/**
215
* Close the dynamic buffer and make a packet from it.
216
*/
217
int
ff_rtp_finalize_packet
(
AVPacket
*
pkt
,
AVIOContext
**dyn_buf,
int
stream_idx);
218
219
#endif
/* AVFORMAT_RTPDEC_H */
Generated on Sun Mar 8 2015 02:35:12 for FFmpeg by
1.8.2