stream-deploy/ZLM/3rdpart/media-server/librtsp/include/rtsp-server.h

202 lines
8.4 KiB
C++

#ifndef _rtsp_server_h_
#define _rtsp_server_h_
#include "rtsp-header-transport.h"
#include <stdint.h>
#include <stddef.h>
#if defined(__cplusplus)
extern "C" {
#endif
typedef struct rtsp_server_t rtsp_server_t;
struct rtsp_handler_t
{
/// rtsp_server_destroy will call this function
/// @param[in] ptr2 user-defined parameter
int (*close)(void* ptr2);
/// Network send
/// @param[in] ptr2 user-defined parameter
/// @param[in] data send data
/// @param[in] bytes data length in byte
/// @return 0-ok, other-error
int (*send)(void* ptr2, const void* data, size_t bytes);
/// RTSP DESCRIBE request(call rtsp_server_reply_describe)
/// @param[in] ptr user-defined parameter
/// @param[in] uri request uri
/// @return 0-ok, other-error
int (*ondescribe)(void* ptr, rtsp_server_t* rtsp, const char* uri);
/// RTSP SETUP request(call rtsp_server_reply_setup)
/// @param[in] ptr user-defined parameter
/// @param[in] uri request uri
/// @param[in] session RTSP Session
/// @param[in] transport RTSP Transport header
/// @return 0-ok, other-error
int (*onsetup)(void* ptr, rtsp_server_t* rtsp, const char* uri, const char* session, const struct rtsp_header_transport_t transports[], size_t num);
/// RTSP PLAY request(call rtsp_server_reply_play)
/// @param[in] ptr user-defined parameter
/// @param[in] session RTSP Session
/// @param[in] npt request begin time, NULL if don't have Range parameter, 0 represent now
/// @param[in] scale request scale, NULL if don't have Scale parameter
/// @return 0-ok, other-error code
int (*onplay)(void* ptr, rtsp_server_t* rtsp, const char* uri, const char* session, const int64_t *npt, const double *scale);
/// RTSP PAUSE request(call rtsp_server_reply_pause)
/// @param[in] ptr user-defined parameter
/// @param[in] session RTSP Session
/// @param[in] npt request pause time, NULL if don't have Range parameter
/// @return 0-ok, other-error code
int (*onpause)(void* ptr, rtsp_server_t* rtsp, const char* uri, const char* session, const int64_t *npt);
/// RTSP TEARDOWN request(call rtsp_server_reply_teardown)
/// @param[in] ptr user-defined parameter
/// @param[in] session RTSP Session
/// @param[in] uri request uri
/// @return 0-ok, other-error code
int (*onteardown)(void* ptr, rtsp_server_t* rtsp, const char* uri, const char* session);
/// RTSP ANNOUNCE request(call rtsp_server_reply_announce)
/// @param[in] ptr user-defined parameter
/// @param[in] uri request uri
/// @param[in] sdp RTSP SDP
/// @return 0-ok, other-error
int (*onannounce)(void* ptr, rtsp_server_t* rtsp, const char* uri, const char* sdp, int len);
/// RTSP RECORD request(call rtsp_server_reply_record)
/// @param[in] ptr user-defined parameter
/// @param[in] session RTSP Session
/// @param[in] npt request begin time, NULL if don't have Range parameter, 0 represent now
/// @param[in] scale request scale, NULL if don't have Scale parameter
/// @return 0-ok, other-error code
int (*onrecord)(void* ptr, rtsp_server_t* rtsp, const char* uri, const char* session, const int64_t *npt, const double *scale);
/// RTSP OPTIONS request
/// @param[in] uri default is '*'
/// @return 0-ok, other-error code
int (*onoptions)(void* ptr, rtsp_server_t* rtsp, const char* uri);
/// RTSP GET_PARAMETER/SET_PARAMETER request
/// use rtsp_server_get_header("content-type") to if need
/// @param[in] uri the presentation/stream uri
/// @param[in] session RTSP session
/// @param[in] content paramter(s), NULL for test client or server liveness ("ping")
/// @return 0-ok, other-error code
int (*ongetparameter)(void* ptr, rtsp_server_t* rtsp, const char* uri, const char* session, const void* content, int bytes);
int (*onsetparameter)(void* ptr, rtsp_server_t* rtsp, const char* uri, const char* session, const void* content, int bytes);
};
/// create (reuse-able) rtsp server
/// param[in] ip peer(client) ip(IPv4/IPv6)
/// param[in] port peer(client) port
/// param[in] handler callbacks
/// param[in] ptr callback(except send) parameter
/// param[in] ptr2 send callback parameter
/// @return NULL-error, other-rtsp server instance
rtsp_server_t* rtsp_server_create(const char ip[65], unsigned short port, struct rtsp_handler_t* handler, void* ptr, void* ptr2);
/// destroy rtsp server
/// @param[in] server rtsp server instance
/// @return 0-ok, other-error code
int rtsp_server_destroy(rtsp_server_t* server);
/// client request
/// @param[in] data rtsp request
/// @param[in,out] bytes input data length, output remain length
/// @return 0-ok, 1-need more data, other-error
int rtsp_server_input(rtsp_server_t* rtsp, const void* data, size_t* bytes);
/// RTSP DESCRIBE reply
/// @param[in] rtsp request handle
/// @param[in] code RTSP status-code(200-OK, 301-Move Permanently, ...)
/// @param[in] sdp RTSP SDP
/// @return 0-ok, other-error code
int rtsp_server_reply_describe(rtsp_server_t* rtsp, int code, const char* sdp);
/// RTSP SETUP reply
/// @param[in] rtsp request handle
/// @param[in] code RTSP status-code(200-OK, 301-Move Permanently, ...)
/// @param[in] session RTSP Session parameter
/// @param[in] transport RTSP Transport parameter
/// @return 0-ok, other-error code
int rtsp_server_reply_setup(rtsp_server_t* rtsp, int code, const char* session, const char* transport);
/// RTSP PLAY reply
/// @param[in] rtsp request handle
/// @param[in] code RTSP status-code(200-OK, 301-Move Permanently, ...)
/// @param[in] nptstart Range start time(ms) [optional]
/// @param[in] nptend Range end time(ms) [optional]
/// @param[in] rtpinfo RTP-info [optional] e.g. url=rtsp://foo.com/bar.avi/streamid=0;seq=45102,url=rtsp://foo.com/bar.avi/streamid=1;seq=30211
/// @return 0-ok, other-error code
int rtsp_server_reply_play(rtsp_server_t* rtsp, int code, const int64_t *nptstart, const int64_t *nptend, const char* rtpinfo);
/// RTSP PAUSE reply
/// @param[in] rtsp request handle
/// @param[in] code RTSP status-code(200-OK, 301-Move Permanently, ...)
/// @return 0-ok, other-error code
int rtsp_server_reply_pause(rtsp_server_t* rtsp, int code);
/// RTSP PAUSE reply
/// @param[in] rtsp request handle
/// @param[in] code RTSP status-code(200-OK, 301-Move Permanently, ...)
/// @return 0-ok, other-error code
int rtsp_server_reply_teardown(rtsp_server_t* rtsp, int code);
/// RTSP ANNOUNCE reply
/// @param[in] rtsp request handle
/// @param[in] code RTSP status-code(200-OK, 301-Move Permanently, ...)
/// @return 0-ok, other-error code
int rtsp_server_reply_announce(rtsp_server_t* rtsp, int code);
/// RTSP RECORD reply
/// @param[in] rtsp request handle
/// @param[in] code RTSP status-code(200-OK, 301-Move Permanently, ...)
/// @param[in] nptstart Range start time(ms) [optional]
/// @param[in] nptend Range end time(ms) [optional]
/// @return 0-ok, other-error code
int rtsp_server_reply_record(rtsp_server_t* rtsp, int code, const int64_t *nptstart, const int64_t *nptend);
/// RTSP OPTIONS reply
/// @return 0-ok, other-error code
int rtsp_server_reply_options(rtsp_server_t* rtsp, int code);
/// RTSP GET_PARAMETER reply(content-type/content-encoding/content-language copy from request header)
/// @param[in] rtsp request handle
/// @param[in] code RTSP status-code(200-OK...)
/// @return 0-ok, other-error code
int rtsp_server_reply_get_parameter(rtsp_server_t* rtsp, int code, const void* content, int bytes);
/// RTSP SET_PARAMETER reply
/// @param[in] rtsp request handle
/// @param[in] code RTSP status-code(200-OK...)
/// @return 0-ok, other-error code
int rtsp_server_reply_set_parameter(rtsp_server_t* rtsp, int code);
/// RTSP send Embedded (Interleaved) Binary Data
/// @param[in] rtsp request handle
/// @param[in] data interleaved binary data, start with 1-byte $ + 1-byte CHANNEL + 2-bytes LEN + RTP/RTCP HEADER + PAYLOAD
/// @param[in] bytes data length in bytes
/// @return 0-ok, other-error code
int rtsp_server_send_interleaved_data(rtsp_server_t* rtsp, const void* data, size_t bytes);
/// find RTSP header
/// @param[in] rtsp request handle
/// @param[in] name header name
/// @return header value, NULL if not found.
/// NOTICE: call in rtsp_handler_t callback only
const char* rtsp_server_get_header(rtsp_server_t* rtsp, const char* name);
/// get client ip/port
const char* rtsp_server_get_client(rtsp_server_t* rtsp, unsigned short* port);
/// @timeout set session timeout in seconds, valid only in setup response(set before rtsp_server_reply_setup)
void rtsp_server_set_session_timeout(rtsp_server_t* rtsp, int timeout);
#if defined(__cplusplus)
}
#endif
#endif /* !_rtsp_server_h_ */