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