X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Frtsp.h;h=0fec3cc9919ce682732e6d2af0a1b2de485dc509;hb=863c471638fa667e6e5c5df059b67af263e1cd40;hp=61b688d08595060316bf7508ac10939e83d241c1;hpb=48e77473e97c2409480cad6be81b5b24468a02b7;p=ffmpeg diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h index 61b688d0859..0fec3cc9919 100644 --- a/libavformat/rtsp.h +++ b/libavformat/rtsp.h @@ -96,7 +96,8 @@ typedef struct RTSPTransportField { * packets will be allowed to make before being discarded. */ int ttl; - uint32_t destination; /**< destination IP address */ + struct sockaddr_storage destination; /**< destination IP address */ + char source[INET6_ADDRSTRLEN + 1]; /**< source IP address */ /** data/packet transport protocol; e.g. RTP or RDT */ enum RTSPTransport transport; @@ -159,6 +160,11 @@ typedef struct RTSPMessageHeader { * http://tools.ietf.org/html/draft-stiemerling-rtsp-announce-00 * for a complete list of supported values. */ int notice; + + /** The "reason" is meant to specify better the meaning of the error code + * returned + */ + char reason[256]; } RTSPMessageHeader; /** @@ -187,7 +193,7 @@ enum RTSPServerType { /** * Private data for the RTSP demuxer. * - * @todo Use ByteIOContext instead of URLContext + * @todo Use AVIOContext instead of URLContext */ typedef struct RTSPState { URLContext *rtsp_hd; /* RTSP TCP connection handle */ @@ -212,7 +218,7 @@ typedef struct RTSPState { int64_t seek_timestamp; /* XXX: currently we use unbuffered input */ - // ByteIOContext rtsp_gb; + // AVIOContext rtsp_gb; int seq; /**< RTSP command sequence number */ @@ -242,6 +248,9 @@ typedef struct RTSPState { * of RTSPMessageHeader->real_challenge */ enum RTSPServerType server_type; + /** the "RealChallenge1:" field from the server */ + char real_challenge[64]; + /** plaintext authorization line (username:password) */ char auth[128]; @@ -262,7 +271,11 @@ typedef struct RTSPState { /** stream setup during the last frame read. This is used to detect if * we need to subscribe or unsubscribe to any new streams. */ - enum AVDiscard real_setup_cache[MAX_STREAMS]; + enum AVDiscard *real_setup_cache; + + /** current stream setup. This is a temporary buffer used to compare + * current setup to previous frame setup. */ + enum AVDiscard *real_setup; /** the last value of the "SET_PARAMETER Subscribe:" RTSP command. * this is used to send the same "Unsubscribe:" if stream setup changed, @@ -285,15 +298,39 @@ typedef struct RTSPState { * other cases, this is a copy of AVFormatContext->filename. */ char control_uri[1024]; - /** 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; + + /* Number of RTCP BYE packets the RTSP session has received. + * An EOF is propagated back if nb_byes == nb_streams. + * This is reset after a seek. */ + int nb_byes; + + /** Reusable buffer for receiving packets */ + uint8_t* recvbuf; + + /** Filter incoming UDP packets - receive packets only from the right + * source address and port. */ + int filter_source; + + /** + * A mask with all requested transport methods + */ + int lower_transport_mask; + + /** + * The number of returned packets + */ + uint64_t packets; + + /** + * Polling array for udp + */ + struct pollfd *p; } RTSPState; /** @@ -318,16 +355,11 @@ typedef struct RTSPStream { /** The following are used only in SDP, not RTSP */ //@{ int sdp_port; /**< port (from SDP content) */ - struct in_addr sdp_ip; /**< IP address (from SDP content) */ + struct sockaddr_storage sdp_ip; /**< IP address (from SDP content) */ int sdp_ttl; /**< IP Time-To-Live (from SDP content) */ 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 */ @@ -339,32 +371,11 @@ typedef struct RTSPStream { } RTSPStream; void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf, - HTTPAuthState *auth_state); + RTSPState *rt, const char *method); -#if LIBAVFORMAT_VERSION_INT < (53 << 16) -extern int rtsp_default_protocols; -#endif extern int rtsp_rtp_port_min; extern int rtsp_rtp_port_max; -/** - * Send a command to the RTSP server without waiting for the reply. - * - * @param s RTSP (de)muxer context - * @param method the method for the request - * @param url the target url for the request - * @param headers extra header lines to include in the request - * @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 - */ -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. * @@ -423,13 +434,15 @@ int ff_rtsp_send_cmd(AVFormatContext *s, const char *method, * data packets (if they are encountered), until a reply * has been fully parsed. If no more data is available * without parsing a reply, it will return an error. + * @param method the RTSP method this is a reply to. This affects how + * some response headers are acted upon. May be NULL. * * @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, unsigned char **content_ptr, - int return_on_interleaved_data); + int return_on_interleaved_data, const char *method); /** * Skip a RTP/TCP interleaved packet. @@ -461,4 +474,47 @@ void ff_rtsp_close_streams(AVFormatContext *s); */ void ff_rtsp_close_connections(AVFormatContext *rt); +/** + * Get the description of the stream and set up the RTSPStream child + * objects. + */ +int ff_rtsp_setup_input_streams(AVFormatContext *s, RTSPMessageHeader *reply); + +/** + * Announce the stream to the server and set up the RTSPStream child + * objects for each media stream. + */ +int ff_rtsp_setup_output_streams(AVFormatContext *s, const char *addr); + +/** + * Parse a SDP description of streams by populating an RTSPState struct + * within the AVFormatContext. + */ +int ff_sdp_parse(AVFormatContext *s, const char *content); + +/** + * Receive one RTP packet from an TCP interleaved RTSP stream. + */ +int ff_rtsp_tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, + uint8_t *buf, int buf_size); + +/** + * Receive one packet from the RTSPStreams set up in the AVFormatContext + * (which should contain a RTSPState struct as priv_data). + */ +int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt); + +/** + * Do the SETUP requests for each stream for the chosen + * lower transport mode. + */ +int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, + int lower_transport, const char *real_challenge); + +/** + * Undo the effect of ff_rtsp_make_setup_request, close the + * transport_priv and rtp_handle fields. + */ +void ff_rtsp_undo_setup(AVFormatContext *s); + #endif /* AVFORMAT_RTSP_H */