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
[50];
117
enum
AVMediaType
codec_type
;
118
enum
AVCodecID
codec_id
;
119
int
static_payload_id
;
/* 0 means no payload id is set. 0 is a valid
120
* payload ID (PCMU), too, but that format doesn't
121
* require any custom depacketization code. */
122
123
/** Initialize dynamic protocol handler, called after the full rtpmap line is parsed, may be null */
124
int (*
init
)(
AVFormatContext
*
s
,
int
st_index,
PayloadContext
*priv_data);
125
/** Parse the a= line from the sdp field */
126
int (*
parse_sdp_a_line
)(
AVFormatContext
*
s
,
int
st_index,
127
PayloadContext
*priv_data,
const
char
*
line
);
128
/** Allocate any data needed by the rtp parsing for this dynamic data. */
129
PayloadContext
*(*alloc)(
void
);
130
/** Free any data needed by the rtp parsing for this dynamic data. */
131
void
(*
free
)(
PayloadContext
*protocol_data);
132
/** Parse handler for this dynamic packet */
133
DynamicPayloadPacketHandlerProc
parse_packet
;
134
int (*
need_keyframe
)(
PayloadContext
*context);
135
136
struct
RTPDynamicProtocolHandler
*
next
;
137
};
138
139
typedef
struct
RTPPacket
{
140
uint16_t
seq
;
141
uint8_t
*
buf
;
142
int
len
;
143
int64_t
recvtime
;
144
struct
RTPPacket
*
next
;
145
}
RTPPacket
;
146
147
struct
RTPDemuxContext
{
148
AVFormatContext
*
ic
;
149
AVStream
*
st
;
150
int
payload_type
;
151
uint32_t
ssrc
;
152
uint16_t
seq
;
153
uint32_t
timestamp
;
154
uint32_t
base_timestamp
;
155
uint32_t
cur_timestamp
;
156
int64_t
unwrapped_timestamp
;
157
int64_t
range_start_offset
;
158
int
max_payload_size
;
159
/* used to send back RTCP RR */
160
char
hostname
[256];
161
162
int
srtp_enabled
;
163
struct
SRTPContext
srtp
;
164
165
/** Statistics for this stream (used by RTCP receiver reports) */
166
RTPStatistics
statistics
;
167
168
/** Fields for packet reordering @{ */
169
int
prev_ret
;
///< The return value of the actual parsing of the previous packet
170
RTPPacket
*
queue
;
///< A sorted queue of buffered packets not yet returned
171
int
queue_len
;
///< The number of packets in queue
172
int
queue_size
;
///< The size of queue, or 0 if reordering is disabled
173
/*@}*/
174
175
/* rtcp sender statistics receive */
176
int64_t
last_rtcp_ntp_time
;
177
int64_t
last_rtcp_reception_time
;
178
int64_t
first_rtcp_ntp_time
;
179
uint32_t
last_rtcp_timestamp
;
180
int64_t
rtcp_ts_offset
;
181
182
/* rtcp sender statistics */
183
unsigned
int
packet_count
;
184
unsigned
int
octet_count
;
185
unsigned
int
last_octet_count
;
186
int64_t
last_feedback_time
;
187
188
/* dynamic payload stuff */
189
const
RTPDynamicProtocolHandler
*
handler
;
190
PayloadContext
*
dynamic_protocol_context
;
191
};
192
193
void
ff_register_dynamic_payload_handler
(
RTPDynamicProtocolHandler
*
handler
);
194
RTPDynamicProtocolHandler
*
ff_rtp_handler_find_by_name
(
const
char
*
name
,
195
enum
AVMediaType
codec_type
);
196
RTPDynamicProtocolHandler
*
ff_rtp_handler_find_by_id
(
int
id
,
197
enum
AVMediaType
codec_type
);
198
199
/* from rtsp.c, but used by rtp dynamic protocol handlers. */
200
int
ff_rtsp_next_attr_and_value
(
const
char
**p,
char
*attr,
int
attr_size,
201
char
*
value
,
int
value_size);
202
203
int
ff_parse_fmtp
(
AVStream
*stream,
PayloadContext
*
data
,
const
char
*p,
204
int
(*
parse_fmtp
)(
AVStream
*stream,
205
PayloadContext
*data,
206
char
*attr,
char
*
value
));
207
208
void
av_register_rtp_dynamic_payload_handlers
(
void
);
209
210
/**
211
* Close the dynamic buffer and make a packet from it.
212
*/
213
int
ff_rtp_finalize_packet
(
AVPacket
*
pkt
,
AVIOContext
**dyn_buf,
int
stream_idx);
214
215
#endif
/* AVFORMAT_RTPDEC_H */
Generated on Sat Jan 25 2014 19:52:04 for FFmpeg by
1.8.2