]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/rtsp.h
Rename av_tempfile() to ff_tempfile()
[ffmpeg] / libavformat / rtsp.h
index d317eee44bd5b796ba044ba40bada58d2f0a613d..2853253e4b573a33ad0d5842417f78b6fcca81c2 100644 (file)
@@ -26,6 +26,7 @@
 #include "rtspcodes.h"
 #include "rtpdec.h"
 #include "network.h"
+#include "httpauth.h"
 
 /**
  * Network layer over which RTP/etc packet data will be transported.
@@ -48,10 +49,19 @@ enum RTSPTransport {
     RTSP_TRANSPORT_NB
 };
 
+/**
+ * Transport mode for the RTSP data. This may be plain, or
+ * tunneled, which is done over HTTP.
+ */
+enum RTSPControlTransport {
+    RTSP_MODE_PLAIN,   /**< Normal RTSP */
+    RTSP_MODE_TUNNEL   /**< RTSP over HTTP (tunneling) */
+};
+
 #define RTSP_DEFAULT_PORT   554
 #define RTSP_MAX_TRANSPORTS 8
 #define RTSP_TCP_MAX_PACKET_SIZE 1472
-#define RTSP_DEFAULT_NB_AUDIO_CHANNELS 2
+#define RTSP_DEFAULT_NB_AUDIO_CHANNELS 1
 #define RTSP_DEFAULT_AUDIO_SAMPLERATE 44100
 #define RTSP_RTP_PORT_MIN 5000
 #define RTSP_RTP_PORT_MAX 10000
@@ -180,7 +190,7 @@ enum RTSPServerType {
  * @todo Use ByteIOContext instead of URLContext
  */
 typedef struct RTSPState {
-    URLContext *rtsp_hd; /* RTSP TCP connexion handle */
+    URLContext *rtsp_hd; /* RTSP TCP connection handle */
 
     /** number of items in the 'rtsp_streams' variable */
     int nb_rtsp_streams;
@@ -232,8 +242,11 @@ typedef struct RTSPState {
      * of RTSPMessageHeader->real_challenge */
     enum RTSPServerType server_type;
 
-    /** base64-encoded authorization lines (username:password) */
-    char *auth_b64;
+    /** plaintext authorization line (username:password) */
+    char auth[128];
+
+    /** authentication state */
+    HTTPAuthState auth_state;
 
     /** The last reply of the server to a RTSP command */
     char last_reply[2048]; /* XXX: allocate ? */
@@ -274,6 +287,13 @@ typedef struct RTSPState {
 
     /** The synchronized start time of the output streams. */
     int64_t start_time;
+
+    /** Additional output handle, used when input and output are done
+     * separately, eg for HTTP tunneling. */
+    URLContext *rtsp_hd_out;
+
+    /** RTSP transport mode, such as plain or tunneled. */
+    enum RTSPControlTransport control_transport;
 } RTSPState;
 
 /**
@@ -303,11 +323,6 @@ typedef struct RTSPStream {
     int sdp_payload_type;     /**< payload type */
     //@}
 
-    /** rtp payload parsing infos from SDP (i.e. mapping between private
-     * payload IDs and media-types (string), so that we can derive what
-     * type of payload we're dealing with (and how to parse it). */
-    RTPPayloadData rtp_payload_data;
-
     /** The following are used for dynamic protocols (rtp_*.c/rdt.c) */
     //@{
     /** handler structure */
@@ -318,7 +333,8 @@ typedef struct RTSPStream {
     //@}
 } RTSPStream;
 
-void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf);
+void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf,
+                        HTTPAuthState *auth_state);
 
 #if LIBAVFORMAT_VERSION_INT < (53 << 16)
 extern int rtsp_default_protocols;
@@ -336,19 +352,21 @@ extern int rtsp_rtp_port_max;
  * @param send_content if non-null, the data to send as request body content
  * @param send_content_length the length of the send_content data, or 0 if
  *                            send_content is null
+ *
+ * @return zero if success, nonzero otherwise
  */
-void ff_rtsp_send_cmd_with_content_async(AVFormatContext *s,
-                                         const char *method, const char *url,
-                                         const char *headers,
-                                         const unsigned char *send_content,
-                                         int send_content_length);
+int ff_rtsp_send_cmd_with_content_async(AVFormatContext *s,
+                                        const char *method, const char *url,
+                                        const char *headers,
+                                        const unsigned char *send_content,
+                                        int send_content_length);
 /**
  * Send a command to the RTSP server without waiting for the reply.
  *
  * @see rtsp_send_cmd_with_content_async
  */
-void ff_rtsp_send_cmd_async(AVFormatContext *s, const char *method,
-                            const char *url, const char *headers);
+int ff_rtsp_send_cmd_async(AVFormatContext *s, const char *method,
+                           const char *url, const char *headers);
 
 /**
  * Send a command to the RTSP server and wait for the reply.
@@ -363,23 +381,25 @@ void ff_rtsp_send_cmd_async(AVFormatContext *s, const char *method,
  * @param send_content if non-null, the data to send as request body content
  * @param send_content_length the length of the send_content data, or 0 if
  *                            send_content is null
+ *
+ * @return zero if success, nonzero otherwise
  */
-void ff_rtsp_send_cmd_with_content(AVFormatContext *s,
-                                   const char *method, const char *url,
-                                   const char *headers,
-                                   RTSPMessageHeader *reply,
-                                   unsigned char **content_ptr,
-                                   const unsigned char *send_content,
-                                   int send_content_length);
+int ff_rtsp_send_cmd_with_content(AVFormatContext *s,
+                                  const char *method, const char *url,
+                                  const char *headers,
+                                  RTSPMessageHeader *reply,
+                                  unsigned char **content_ptr,
+                                  const unsigned char *send_content,
+                                  int send_content_length);
 
 /**
  * Send a command to the RTSP server and wait for the reply.
  *
  * @see rtsp_send_cmd_with_content
  */
-void ff_rtsp_send_cmd(AVFormatContext *s, const char *method,
-                      const char *url, const char *headers,
-                      RTSPMessageHeader *reply, unsigned char **content_ptr);
+int ff_rtsp_send_cmd(AVFormatContext *s, const char *method,
+                     const char *url, const char *headers,
+                     RTSPMessageHeader *reply, unsigned char **content_ptr);
 
 /**
  * Read a RTSP message from the server, or prepare to read data
@@ -399,7 +419,7 @@ void ff_rtsp_send_cmd(AVFormatContext *s, const char *method,
  *                   has been fully parsed. If no more data is available
  *                   without parsing a reply, it will return an error.
  *
- * @returns 1 if a data packets is ready to be received, -1 on error,
+ * @return 1 if a data packets is ready to be received, -1 on error,
  *          and 0 on success.
  */
 int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply,
@@ -417,7 +437,7 @@ void ff_rtsp_skip_packet(AVFormatContext *s);
  *
  * @param s RTSP (de)muxer context
  *
- * @returns 0 on success, < 0 on error. Cleans up all allocations done
+ * @return 0 on success, < 0 on error. Cleans up all allocations done
  *          within the function on error.
  */
 int ff_rtsp_connect(AVFormatContext *s);
@@ -429,4 +449,11 @@ int ff_rtsp_connect(AVFormatContext *s);
  */
 void ff_rtsp_close_streams(AVFormatContext *s);
 
+/**
+ * Close all connection handles within the RTSP (de)muxer
+ *
+ * @param rt RTSP (de)muxer context
+ */
+void ff_rtsp_close_connections(AVFormatContext *rt);
+
 #endif /* AVFORMAT_RTSP_H */