00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef AVFORMAT_RTSP_H
00022 #define AVFORMAT_RTSP_H
00023
00024 #include <stdint.h>
00025 #include "avformat.h"
00026 #include "rtspcodes.h"
00027 #include "rtpdec.h"
00028 #include "network.h"
00029 #include "httpauth.h"
00030
00034 enum RTSPLowerTransport {
00035 RTSP_LOWER_TRANSPORT_UDP = 0,
00036 RTSP_LOWER_TRANSPORT_TCP = 1,
00037 RTSP_LOWER_TRANSPORT_UDP_MULTICAST = 2,
00038 RTSP_LOWER_TRANSPORT_NB
00039 };
00040
00046 enum RTSPTransport {
00047 RTSP_TRANSPORT_RTP,
00048 RTSP_TRANSPORT_RDT,
00049 RTSP_TRANSPORT_NB
00050 };
00051
00052 #define RTSP_DEFAULT_PORT 554
00053 #define RTSP_MAX_TRANSPORTS 8
00054 #define RTSP_TCP_MAX_PACKET_SIZE 1472
00055 #define RTSP_DEFAULT_NB_AUDIO_CHANNELS 2
00056 #define RTSP_DEFAULT_AUDIO_SAMPLERATE 44100
00057 #define RTSP_RTP_PORT_MIN 5000
00058 #define RTSP_RTP_PORT_MAX 10000
00059
00067 typedef struct RTSPTransportField {
00072 int interleaved_min, interleaved_max;
00073
00076 int port_min, port_max;
00077
00080 int client_port_min, client_port_max;
00081
00084 int server_port_min, server_port_max;
00085
00088 int ttl;
00089
00090 uint32_t destination;
00093 enum RTSPTransport transport;
00094
00096 enum RTSPLowerTransport lower_transport;
00097 } RTSPTransportField;
00098
00102 typedef struct RTSPMessageHeader {
00104 int content_length;
00105
00106 enum RTSPStatusCode status_code;
00109 int nb_transports;
00110
00113 int64_t range_start, range_end;
00114
00117 RTSPTransportField transports[RTSP_MAX_TRANSPORTS];
00118
00119 int seq;
00123 char session_id[512];
00124
00127 char location[4096];
00128
00130 char real_challenge[64];
00131
00139 char server[64];
00140
00147 int timeout;
00148
00152 int notice;
00153 } RTSPMessageHeader;
00154
00160 enum RTSPClientState {
00161 RTSP_STATE_IDLE,
00162 RTSP_STATE_STREAMING,
00163 RTSP_STATE_PAUSED,
00164 RTSP_STATE_SEEKING,
00165 };
00166
00171 enum RTSPServerType {
00172 RTSP_SERVER_RTP,
00173 RTSP_SERVER_REAL,
00174 RTSP_SERVER_WMS,
00175 RTSP_SERVER_NB
00176 };
00177
00183 typedef struct RTSPState {
00184 URLContext *rtsp_hd;
00185
00187 int nb_rtsp_streams;
00188
00189 struct RTSPStream **rtsp_streams;
00195 enum RTSPClientState state;
00196
00203 int64_t seek_timestamp;
00204
00205
00206
00207
00208 int seq;
00212 char session_id[512];
00213
00217 int timeout;
00218
00222 int64_t last_cmd_time;
00223
00225 enum RTSPTransport transport;
00226
00229 enum RTSPLowerTransport lower_transport;
00230
00234 enum RTSPServerType server_type;
00235
00237 char auth[128];
00238
00240 HTTPAuthState auth_state;
00241
00243 char last_reply[2048];
00244
00247 void *cur_transport_priv;
00248
00252 int need_subscription;
00253
00256 enum AVDiscard real_setup_cache[MAX_STREAMS];
00257
00261 char last_subscription[1024];
00263
00267 AVFormatContext *asf_ctx;
00268
00271 uint64_t asf_pb_pos;
00273
00277 char control_uri[1024];
00278
00280 int64_t start_time;
00281 } RTSPState;
00282
00289 typedef struct RTSPStream {
00290 URLContext *rtp_handle;
00291 void *transport_priv;
00294 int stream_index;
00295
00298 int interleaved_min, interleaved_max;
00299
00300 char control_url[1024];
00304 int sdp_port;
00305 struct in_addr sdp_ip;
00306 int sdp_ttl;
00307 int sdp_payload_type;
00309
00313 RTPPayloadData rtp_payload_data;
00314
00318 RTPDynamicProtocolHandler *dynamic_handler;
00319
00321 PayloadContext *dynamic_protocol_context;
00323 } RTSPStream;
00324
00325 void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf,
00326 HTTPAuthState *auth_state);
00327
00328 #if LIBAVFORMAT_VERSION_INT < (53 << 16)
00329 extern int rtsp_default_protocols;
00330 #endif
00331 extern int rtsp_rtp_port_min;
00332 extern int rtsp_rtp_port_max;
00333
00345 void ff_rtsp_send_cmd_with_content_async(AVFormatContext *s,
00346 const char *method, const char *url,
00347 const char *headers,
00348 const unsigned char *send_content,
00349 int send_content_length);
00355 void ff_rtsp_send_cmd_async(AVFormatContext *s, const char *method,
00356 const char *url, const char *headers);
00357
00372 void ff_rtsp_send_cmd_with_content(AVFormatContext *s,
00373 const char *method, const char *url,
00374 const char *headers,
00375 RTSPMessageHeader *reply,
00376 unsigned char **content_ptr,
00377 const unsigned char *send_content,
00378 int send_content_length);
00379
00385 void ff_rtsp_send_cmd(AVFormatContext *s, const char *method,
00386 const char *url, const char *headers,
00387 RTSPMessageHeader *reply, unsigned char **content_ptr);
00388
00410 int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply,
00411 unsigned char **content_ptr,
00412 int return_on_interleaved_data);
00413
00417 void ff_rtsp_skip_packet(AVFormatContext *s);
00418
00428 int ff_rtsp_connect(AVFormatContext *s);
00429
00435 void ff_rtsp_close_streams(AVFormatContext *s);
00436
00437 #endif