FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
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 1500
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 Sat May 25 2013 04:01:19 for FFmpeg by
1.8.2