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
int
ff_rtp_get_local_rtp_port
(
URLContext
*h);
55
int
ff_rtp_get_local_rtcp_port
(
URLContext
*h);
56
57
int
ff_rtp_set_remote_url
(
URLContext
*h,
const
char
*uri);
58
59
/**
60
* Send a dummy packet on both port pairs to set up the connection
61
* state in potential NAT routers, so that we're able to receive
62
* packets.
63
*
64
* Note, this only works if the NAT router doesn't remap ports. This
65
* isn't a standardized procedure, but it works in many cases in practice.
66
*
67
* The same routine is used with RDT too, even if RDT doesn't use normal
68
* RTP packets otherwise.
69
*/
70
void
ff_rtp_send_punch_packets
(
URLContext
* rtp_handle);
71
72
/**
73
* some rtp servers assume client is dead if they don't hear from them...
74
* so we send a Receiver Report to the provided URLContext or AVIOContext
75
* (we don't have access to the rtcp handle from here)
76
*/
77
int
ff_rtp_check_and_send_back_rr
(
RTPDemuxContext
*
s
,
URLContext
*fd,
78
AVIOContext
*avio,
int
count
);
79
int
ff_rtp_send_rtcp_feedback
(
RTPDemuxContext
*
s
,
URLContext
*fd,
80
AVIOContext
*avio);
81
82
// these statistics are used for rtcp receiver reports...
83
typedef
struct
RTPStatistics
{
84
uint16_t
max_seq
;
///< highest sequence number seen
85
uint32_t
cycles
;
///< shifted count of sequence number cycles
86
uint32_t
base_seq
;
///< base sequence number
87
uint32_t
bad_seq
;
///< last bad sequence number + 1
88
int
probation
;
///< sequence packets till source is valid
89
uint32_t
received
;
///< packets received
90
uint32_t
expected_prior
;
///< packets expected in last interval
91
uint32_t
received_prior
;
///< packets received in last interval
92
uint32_t
transit
;
///< relative transit time for previous packet
93
uint32_t
jitter
;
///< estimated jitter.
94
}
RTPStatistics
;
95
96
#define RTP_FLAG_KEY 0x1
///< RTP packet contains a keyframe
97
#define RTP_FLAG_MARKER 0x2
///< RTP marker bit was set for this packet
98
/**
99
* Packet parsing for "private" payloads in the RTP specs.
100
*
101
* @param ctx RTSP demuxer context
102
* @param s stream context
103
* @param st stream that this packet belongs to
104
* @param pkt packet in which to write the parsed data
105
* @param timestamp pointer to the RTP timestamp of the input data, can be
106
* updated by the function if returning older, buffered data
107
* @param buf pointer to raw RTP packet data
108
* @param len length of buf
109
* @param seq RTP sequence number of the packet
110
* @param flags flags from the RTP packet header (RTP_FLAG_*)
111
*/
112
typedef
int (*
DynamicPayloadPacketHandlerProc
)(
AVFormatContext
*ctx,
113
PayloadContext
*
s
,
114
AVStream
*st,
AVPacket
*
pkt
,
115
uint32_t *timestamp,
116
const
uint8_t
*
buf
,
117
int
len
, uint16_t seq,
int
flags
);
118
119
struct
RTPDynamicProtocolHandler
{
120
const
char
enc_name
[50];
121
enum
AVMediaType
codec_type
;
122
enum
AVCodecID
codec_id
;
123
int
static_payload_id
;
/* 0 means no payload id is set. 0 is a valid
124
* payload ID (PCMU), too, but that format doesn't
125
* require any custom depacketization code. */
126
127
/** Initialize dynamic protocol handler, called after the full rtpmap line is parsed, may be null */
128
int (*
init
)(
AVFormatContext
*
s
,
int
st_index,
PayloadContext
*priv_data);
129
/** Parse the a= line from the sdp field */
130
int (*
parse_sdp_a_line
)(
AVFormatContext
*
s
,
int
st_index,
131
PayloadContext
*priv_data,
const
char
*
line
);
132
/** Allocate any data needed by the rtp parsing for this dynamic data. */
133
PayloadContext
*(*alloc)(
void
);
134
/** Free any data needed by the rtp parsing for this dynamic data. */
135
void
(*
free
)(
PayloadContext
*protocol_data);
136
/** Parse handler for this dynamic packet */
137
DynamicPayloadPacketHandlerProc
parse_packet
;
138
int (*
need_keyframe
)(
PayloadContext
*context);
139
140
struct
RTPDynamicProtocolHandler
*
next
;
141
};
142
143
typedef
struct
RTPPacket
{
144
uint16_t
seq
;
145
uint8_t
*
buf
;
146
int
len
;
147
int64_t
recvtime
;
148
struct
RTPPacket
*
next
;
149
}
RTPPacket
;
150
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
int64_t
unwrapped_timestamp
;
161
int64_t
range_start_offset
;
162
int
max_payload_size
;
163
/* used to send back RTCP RR */
164
char
hostname
[256];
165
166
int
srtp_enabled
;
167
struct
SRTPContext
srtp
;
168
169
/** Statistics for this stream (used by RTCP receiver reports) */
170
RTPStatistics
statistics
;
171
172
/** Fields for packet reordering @{ */
173
int
prev_ret
;
///< The return value of the actual parsing of the previous packet
174
RTPPacket
*
queue
;
///< A sorted queue of buffered packets not yet returned
175
int
queue_len
;
///< The number of packets in queue
176
int
queue_size
;
///< The size of queue, or 0 if reordering is disabled
177
/*@}*/
178
179
/* rtcp sender statistics receive */
180
int64_t
last_rtcp_ntp_time
;
181
int64_t
last_rtcp_reception_time
;
182
int64_t
first_rtcp_ntp_time
;
183
uint32_t
last_rtcp_timestamp
;
184
int64_t
rtcp_ts_offset
;
185
186
/* rtcp sender statistics */
187
unsigned
int
packet_count
;
188
unsigned
int
octet_count
;
189
unsigned
int
last_octet_count
;
190
int64_t
last_feedback_time
;
191
192
/* dynamic payload stuff */
193
const
RTPDynamicProtocolHandler
*
handler
;
194
PayloadContext
*
dynamic_protocol_context
;
195
};
196
197
void
ff_register_dynamic_payload_handler
(
RTPDynamicProtocolHandler
*handler);
198
RTPDynamicProtocolHandler
*
ff_rtp_handler_find_by_name
(
const
char
*
name
,
199
enum
AVMediaType
codec_type
);
200
RTPDynamicProtocolHandler
*
ff_rtp_handler_find_by_id
(
int
id
,
201
enum
AVMediaType
codec_type
);
202
203
/* from rtsp.c, but used by rtp dynamic protocol handlers. */
204
int
ff_rtsp_next_attr_and_value
(
const
char
**p,
char
*attr,
int
attr_size,
205
char
*
value
,
int
value_size);
206
207
int
ff_parse_fmtp
(
AVStream
*stream,
PayloadContext
*
data
,
const
char
*p,
208
int
(*
parse_fmtp
)(
AVStream
*stream,
209
PayloadContext
*data,
210
char
*attr,
char
*
value
));
211
212
void
av_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 Wed Jul 10 2013 23:48:14 for FFmpeg by
1.8.2