rtsp.h 4.7 KB
Newer Older
1 2
/*
 * RTSP definitions
3
 * Copyright (c) 2002 Fabrice Bellard
4
 *
5 6 7
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
8 9
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13 14 15 16 17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21 22
#ifndef FFMPEG_RTSP_H
#define FFMPEG_RTSP_H
23

24 25
#include <stdint.h>
#include "avformat.h"
26
#include "rtspcodes.h"
27
#include "rtpdec.h"
28
#include "network.h"
29

30 31 32 33 34
enum RTSPLowerTransport {
    RTSP_LOWER_TRANSPORT_UDP = 0,
    RTSP_LOWER_TRANSPORT_TCP = 1,
    RTSP_LOWER_TRANSPORT_UDP_MULTICAST = 2,
    RTSP_LOWER_TRANSPORT_LAST
35 36
};

37 38 39 40 41 42
enum RTSPTransport {
    RTSP_TRANSPORT_RTP,
    RTSP_TRANSPORT_RDT,
    RTSP_TRANSPORT_LAST
};

43 44
#define RTSP_DEFAULT_PORT   554
#define RTSP_MAX_TRANSPORTS 8
45
#define RTSP_TCP_MAX_PACKET_SIZE 1472
R
Romain Degez 已提交
46 47 48 49
#define RTSP_DEFAULT_NB_AUDIO_CHANNELS 2
#define RTSP_DEFAULT_AUDIO_SAMPLERATE 44100
#define RTSP_RTP_PORT_MIN 5000
#define RTSP_RTP_PORT_MAX 10000
50 51

typedef struct RTSPTransportField {
52 53 54 55 56 57
    int interleaved_min, interleaved_max;  /**< interleave ids, if TCP transport */
    int port_min, port_max; /**< RTP ports */
    int client_port_min, client_port_max; /**< RTP ports */
    int server_port_min, server_port_max; /**< RTP ports */
    int ttl; /**< ttl value */
    uint32_t destination; /**< destination IP address */
58
    enum RTSPTransport transport;
59
    enum RTSPLowerTransport lower_transport;
60 61 62 63
} RTSPTransportField;

typedef struct RTSPHeader {
    int content_length;
64
    enum RTSPStatusCode status_code; /**< response code from server */
65
    int nb_transports;
66
    /** in AV_TIME_BASE unit, AV_NOPTS_VALUE if not used */
67
    int64_t range_start, range_end;
68
    RTSPTransportField transports[RTSP_MAX_TRANSPORTS];
69
    int seq; /**< sequence number */
70
    char session_id[512];
71
    char real_challenge[64]; /**< the RealChallenge1 field from the server */
72
    char server[64];
73 74
} RTSPHeader;

75 76 77 78 79 80 81
enum RTSPClientState {
    RTSP_STATE_IDLE,
    RTSP_STATE_PLAYING,
    RTSP_STATE_PAUSED,
};

enum RTSPServerType {
82
    RTSP_SERVER_RTP,  /**< Standards-compliant RTP-server */
83 84
    RTSP_SERVER_REAL, /**< Realmedia-style server */
    RTSP_SERVER_WMS,  /**< Windows Media server */
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
    RTSP_SERVER_LAST
};

typedef struct RTSPState {
    URLContext *rtsp_hd; /* RTSP TCP connexion handle */
    int nb_rtsp_streams;
    struct RTSPStream **rtsp_streams;

    enum RTSPClientState state;
    int64_t seek_timestamp;

    /* XXX: currently we use unbuffered input */
    //    ByteIOContext rtsp_gb;
    int seq;        /* RTSP command sequence number */
    char session_id[512];
    enum RTSPTransport transport;
    enum RTSPLowerTransport lower_transport;
    enum RTSPServerType server_type;
    char last_reply[2048]; /* XXX: allocate ? */
104
    void *cur_transport_priv;
105 106 107 108 109 110 111
    int need_subscription;
    enum AVDiscard real_setup_cache[MAX_STREAMS];
    char last_subscription[1024];
} RTSPState;

typedef struct RTSPStream {
    URLContext *rtp_handle; /* RTP stream handle */
112
    void *transport_priv; /* RTP/RDT parse context */
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

    int stream_index; /* corresponding stream index, if any. -1 if none (MPEG2TS case) */
    int interleaved_min, interleaved_max;  /* interleave ids, if TCP transport */
    char control_url[1024]; /* url for this stream (from SDP) */

    int sdp_port; /* port (from SDP content - not used in RTSP) */
    struct in_addr sdp_ip; /* IP address  (from SDP content - not used in RTSP) */
    int sdp_ttl;  /* IP TTL (from SDP content - not used in RTSP) */
    int sdp_payload_type; /* payload type - only used in SDP */
    RTPPayloadData rtp_payload_data; /* rtp payload parsing infos from SDP */

    RTPDynamicProtocolHandler *dynamic_handler; ///< Only valid if it's a dynamic protocol. (This is the handler structure)
    PayloadContext *dynamic_protocol_context; ///< Only valid if it's a dynamic protocol. (This is any private data associated with the dynamic protocol)
} RTSPStream;

128 129 130
int rtsp_init(void);
void rtsp_parse_line(RTSPHeader *reply, const char *buf);

R
Ronald S. Bultje 已提交
131
#if LIBAVFORMAT_VERSION_INT < (53 << 16)
132
extern int rtsp_default_protocols;
R
Ronald S. Bultje 已提交
133
#endif
F
Fabrice Bellard 已提交
134 135
extern int rtsp_rtp_port_min;
extern int rtsp_rtp_port_max;
136 137 138

int rtsp_pause(AVFormatContext *s);
int rtsp_resume(AVFormatContext *s);
139

140
#endif /* FFMPEG_RTSP_H */