~ubuntu-branches/ubuntu/lucid/ffmpeg/lucid-security

« back to all changes in this revision

Viewing changes to libavformat/rtp.h

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2009-03-13 09:18:28 UTC
  • mfrom: (1.1.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20090313091828-n4ktby5eca487uhv
Tags: 3:0.svn20090303-1ubuntu1+unstripped1
merge from ubuntu.jaunty branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 * RTP definitions
3
3
 * Copyright (c) 2002 Fabrice Bellard
4
 
 * Copyright (c) 2006 Ryan Martell <rdm4@martellventures.com>
5
4
 *
6
5
 * This file is part of FFmpeg.
7
6
 *
23
22
#define AVFORMAT_RTP_H
24
23
 
25
24
#include "libavcodec/avcodec.h"
26
 
#include "avformat.h"
27
 
 
28
 
/** Structure listing useful vars to parse RTP packet payload*/
29
 
typedef struct rtp_payload_data
30
 
{
31
 
    int sizelength;
32
 
    int indexlength;
33
 
    int indexdeltalength;
34
 
    int profile_level_id;
35
 
    int streamtype;
36
 
    int objecttype;
37
 
    char *mode;
38
 
 
39
 
    /** mpeg 4 AU headers */
40
 
    struct AUHeaders {
41
 
        int size;
42
 
        int index;
43
 
        int cts_flag;
44
 
        int cts;
45
 
        int dts_flag;
46
 
        int dts;
47
 
        int rap_flag;
48
 
        int streamstate;
49
 
    } *au_headers;
50
 
    int nb_au_headers;
51
 
    int au_headers_length_bytes;
52
 
    int cur_au_index;
53
 
} RTPPayloadData;
54
 
 
55
 
typedef struct PayloadContext PayloadContext;
56
 
typedef struct RTPDynamicProtocolHandler_s RTPDynamicProtocolHandler;
57
 
 
58
 
#define RTP_MIN_PACKET_LENGTH 12
59
 
#define RTP_MAX_PACKET_LENGTH 1500 /* XXX: suppress this define */
60
 
 
61
 
int rtp_get_codec_info(AVCodecContext *codec, int payload_type);
62
 
 
63
 
/** return < 0 if unknown payload type */
64
 
int rtp_get_payload_type(AVCodecContext *codec);
65
 
 
66
 
typedef struct RTPDemuxContext RTPDemuxContext;
67
 
RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, RTPPayloadData *rtp_payload_data);
68
 
void rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx,
69
 
                                    RTPDynamicProtocolHandler *handler);
70
 
int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
71
 
                     const uint8_t *buf, int len);
72
 
void rtp_parse_close(RTPDemuxContext *s);
73
 
 
74
 
int rtp_get_local_port(URLContext *h);
75
 
int rtp_set_remote_url(URLContext *h, const char *uri);
76
 
void rtp_get_file_handles(URLContext *h, int *prtp_fd, int *prtcp_fd);
77
 
 
78
 
/**
79
 
 * some rtp servers assume client is dead if they don't hear from them...
80
 
 * so we send a Receiver Report to the provided ByteIO context
81
 
 * (we don't have access to the rtcp handle from here)
82
 
 */
83
 
int rtp_check_and_send_back_rr(RTPDemuxContext *s, int count);
 
25
 
 
26
/**
 
27
 * Return the payload type for a given codec.
 
28
 *
 
29
 * @param codec The context of the codec
 
30
 * @return In case of unknown payload type or dynamic payload type, a
 
31
 * negative value is returned; otherwise, the payload type (the 'PT' field
 
32
 * in the RTP header) is returned.
 
33
 */
 
34
int ff_rtp_get_payload_type(AVCodecContext *codec);
 
35
 
 
36
/**
 
37
 * Initialize a codec context based on the payload type.
 
38
 *
 
39
 * Fill the codec_type and codec_id fields of a codec context with
 
40
 * information depending on the payload type; for audio codecs, the
 
41
 * channels and sample_rate fields are also filled.
 
42
 *
 
43
 * @param codec The context of the codec
 
44
 * @param payload_type The payload type (the 'PT' field in the RTP header)
 
45
 * @return In case of unknown payload type or dynamic payload type, a
 
46
 * negative value is returned; otherwise, 0 is returned
 
47
 */
 
48
int ff_rtp_get_codec_info(AVCodecContext *codec, int payload_type);
 
49
 
 
50
/**
 
51
 * Return the encoding name (as defined in
 
52
 * http://www.iana.org/assignments/rtp-parameters) for a given payload type.
 
53
 *
 
54
 * @param payload_type The payload type (the 'PT' field in the RTP header)
 
55
 * @return In case of unknown payload type or dynamic payload type, a pointer
 
56
 * to an empty string is returned; otherwise, a pointer to a string containing
 
57
 * the encoding name is returned
 
58
 */
 
59
const char *ff_rtp_enc_name(int payload_type);
 
60
 
 
61
/**
 
62
 * Return the codec id for the given encoding name and codec type.
 
63
 *
 
64
 * @param buf A pointer to the string containing the encoding name
 
65
 * @param codec_type The codec type
 
66
 * @return In case of unknown encoding name, CODEC_ID_NONE is returned;
 
67
 * otherwise, the codec id is returned
 
68
 */
 
69
enum CodecID ff_rtp_codec_id(const char *buf, enum CodecType codec_type);
84
70
 
85
71
#define RTP_PT_PRIVATE 96
86
72
#define RTP_VERSION 2
90
76
#define RTCP_TX_RATIO_NUM 5
91
77
#define RTCP_TX_RATIO_DEN 1000
92
78
 
93
 
// these statistics are used for rtcp receiver reports...
94
 
typedef struct {
95
 
    uint16_t max_seq;           ///< highest sequence number seen
96
 
    uint32_t cycles;            ///< shifted count of sequence number cycles
97
 
    uint32_t base_seq;          ///< base sequence number
98
 
    uint32_t bad_seq;           ///< last bad sequence number + 1
99
 
    int probation;              ///< sequence packets till source is valid
100
 
    int received;               ///< packets received
101
 
    int expected_prior;         ///< packets expected in last interval
102
 
    int received_prior;         ///< packets received in last interval
103
 
    uint32_t transit;           ///< relative transit time for previous packet
104
 
    uint32_t jitter;            ///< estimated jitter.
105
 
} RTPStatistics;
106
 
 
107
 
/**
108
 
 * Packet parsing for "private" payloads in the RTP specs.
109
 
 *
110
 
 * @param s stream context
111
 
 * @param st stream that this packet belongs to
112
 
 * @param pkt packet in which to write the parsed data
113
 
 * @param timestamp pointer in which to write the timestamp of this RTP packet
114
 
 * @param buf pointer to raw RTP packet data
115
 
 * @param len length of buf
116
 
 * @param flags flags from the RTP packet header (PKT_FLAG_*)
117
 
 */
118
 
typedef int (*DynamicPayloadPacketHandlerProc) (PayloadContext *s,
119
 
                                                AVStream *st,
120
 
                                                AVPacket * pkt,
121
 
                                                uint32_t *timestamp,
122
 
                                                const uint8_t * buf,
123
 
                                                int len, int flags);
124
 
 
125
 
struct RTPDynamicProtocolHandler_s {
126
 
    // fields from AVRtpDynamicPayloadType_s
127
 
    const char enc_name[50];    /* XXX: still why 50 ? ;-) */
128
 
    enum CodecType codec_type;
129
 
    enum CodecID codec_id;
130
 
 
131
 
    // may be null
132
 
    int (*parse_sdp_a_line) (AVFormatContext *s,
133
 
                             int st_index,
134
 
                             PayloadContext *priv_data,
135
 
                             const char *line); ///< Parse the a= line from the sdp field
136
 
    PayloadContext *(*open) (); ///< allocate any data needed by the rtp parsing for this dynamic data.
137
 
    void (*close)(PayloadContext *protocol_data); ///< free any data needed by the rtp parsing for this dynamic data.
138
 
    DynamicPayloadPacketHandlerProc parse_packet; ///< parse handler for this dynamic packet.
139
 
 
140
 
    struct RTPDynamicProtocolHandler_s *next;
141
 
};
142
 
 
143
 
// moved out of rtp.c, because the h264 decoder needs to know about this structure..
144
 
struct RTPDemuxContext {
145
 
    AVFormatContext *ic;
146
 
    AVStream *st;
147
 
    int payload_type;
148
 
    uint32_t ssrc;
149
 
    uint16_t seq;
150
 
    uint32_t timestamp;
151
 
    uint32_t base_timestamp;
152
 
    uint32_t cur_timestamp;
153
 
    int max_payload_size;
154
 
    struct MpegTSContext *ts;   /* only used for MP2T payloads */
155
 
    int read_buf_index;
156
 
    int read_buf_size;
157
 
    /* used to send back RTCP RR */
158
 
    URLContext *rtp_ctx;
159
 
    char hostname[256];
160
 
 
161
 
    RTPStatistics statistics; ///< Statistics for this stream (used by RTCP receiver reports)
162
 
 
163
 
    /* rtcp sender statistics receive */
164
 
    int64_t last_rtcp_ntp_time;    // TODO: move into statistics
165
 
    int64_t first_rtcp_ntp_time;   // TODO: move into statistics
166
 
    uint32_t last_rtcp_timestamp;  // TODO: move into statistics
167
 
 
168
 
    /* rtcp sender statistics */
169
 
    unsigned int packet_count;     // TODO: move into statistics (outgoing)
170
 
    unsigned int octet_count;      // TODO: move into statistics (outgoing)
171
 
    unsigned int last_octet_count; // TODO: move into statistics (outgoing)
172
 
    int first_packet;
173
 
    /* buffer for output */
174
 
    uint8_t buf[RTP_MAX_PACKET_LENGTH];
175
 
    uint8_t *buf_ptr;
176
 
 
177
 
    /* special infos for au headers parsing */
178
 
    RTPPayloadData *rtp_payload_data; // TODO: Move into dynamic payload handlers
179
 
 
180
 
    /* dynamic payload stuff */
181
 
    DynamicPayloadPacketHandlerProc parse_packet;     ///< This is also copied from the dynamic protocol handler structure
182
 
    PayloadContext *dynamic_protocol_context;        ///< This is a copy from the values setup from the sdp parsing, in rtsp.c don't free me.
183
 
    int max_frames_per_packet;
184
 
};
185
 
 
186
 
extern RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler;
187
 
void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler);
188
 
 
189
 
int rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size); ///< from rtsp.c, but used by rtp dynamic protocol handlers.
190
 
 
191
 
void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m);
192
 
const char *ff_rtp_enc_name(int payload_type);
193
 
enum CodecID ff_rtp_codec_id(const char *buf, enum CodecType codec_type);
194
 
 
195
 
void av_register_rtp_dynamic_payload_handlers(void);
196
 
 
197
79
#endif /* AVFORMAT_RTP_H */