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