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