Files

244 lines
9.8 KiB
C
Raw Permalink Normal View History

2026-03-28 16:54:11 +11:00
/***************************************************************************************
*
* IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
*
* By downloading, copying, installing or using the software you agree to this license.
* If you do not agree to this license, do not download, install,
* copy or use the software.
*
* Copyright (C) 2014-2024, Happytimesoft Corporation, all rights reserved.
*
* Redistribution and use in binary forms, with or without modification, are permitted.
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
* language governing permissions and limitations under the License.
*
****************************************************************************************/
#ifndef RTSP_RCUA_H
#define RTSP_RCUA_H
#include "rtsp_parse.h"
#include "http.h"
#ifdef BACKCHANNEL
#include "audio_capture.h"
#endif
#ifdef OVER_WEBSOCKET
#include "rtsp_ws.h"
#endif
#define AV_TYPE_VIDEO 0
#define AV_TYPE_AUDIO 1
#define AV_TYPE_METADATA 2
#define AV_TYPE_BACKCHANNEL 3
#define AV_MAX_CHS 4
#define AV_VIDEO_CH AV_TYPE_VIDEO
#define AV_AUDIO_CH AV_TYPE_AUDIO
#define AV_METADATA_CH AV_TYPE_METADATA
#define AV_BACK_CH AV_TYPE_BACKCHANNEL
/**
* RTSP over websocket needs to reserve some space
* in the header of the send buffer
*/
#define RTSP_SND_RESV_SIZE 32
typedef enum rtsp_client_states
{
RCS_NULL = 0,
RCS_OPTIONS,
RCS_DESCRIBE,
RCS_INIT_V,
RCS_INIT_A,
RCS_INIT_M,
RCS_INIT_BC,
RCS_READY,
RCS_PLAYING,
RCS_RECORDING,
} RCSTATE;
typedef struct rtsp_client_media_channel
{
int disabled; // not setup this channel
SOCKET udp_fd; // udp socket
SOCKET rtcp_fd; // rtcp udp socket
char ctl[128]; // control string
uint16 setup; // whether the media channel already be setuped
uint16 r_port; // remote udp port
uint16 l_port; // local udp port
uint16 interleaved; // rtp channel values
char destination[32]; // multicast address
int cap_count; // Local number of capabilities
uint8 cap[MAX_AVN]; // Local capability
char cap_desc[MAX_AVN][MAX_AVDESCLEN];
} RCMCH;
typedef struct rtsp_client_user_agent
{
uint32 used_flag : 1; // used flag
uint32 rtp_tcp : 1; // rtp over tcp
uint32 mcast_flag : 1; // use rtp multicast, set by user
uint32 rtp_mcast : 1; // use rtp multicast, set by stack
uint32 rtp_tx : 1; // rtp sending flag
uint32 need_auth : 1; // need auth flag
uint32 auth_mode : 2; // 0 - baisc; 1 - digest
uint32 gp_cmd : 1; // is support get_parameter command
uint32 backchannel : 1; // audio backchannle flag
uint32 send_bc_data: 1; // audio backchannel data sending flag
uint32 replay : 1; // replay flag
uint32 over_http : 1; // rtsp over http flag
uint32 over_ws : 1; // rtsp over websocket flag
uint32 auth_retry : 3; // auth retry numbers
uint32 reserved : 15;
int state; // state, RCSTATE
SOCKET fd; // socket handler
uint32 keepalive_time; // keepalive time
char ripstr[128]; // remote ip
uint16 rport; // rtsp server port
uint32 cseq; // seq no
char sid[64]; // Session ID
char uri[256]; // rtsp://221.10.50.195:554/cctv.sdp
char cbase[256]; // Content-Base: rtsp://221.10.50.195:554/broadcast.sdp/
char user_agent[64]; // user agent string
int session_timeout; // session timeout value
int play_start; // a=range:npt=0-20.735, unit is millisecond
int play_end; // a=range:npt=0-20.735, unit is millisecond
uint32 video_init_ts; // video init timestampe
uint32 audio_init_ts; // audio init timestampe
int seek_pos; // seek pos
int media_start; // media start time, unit is millisecond
char rcv_buf[2052]; // receive buffer
int rcv_dlen; // receive data length
int rtp_t_len; // rtp payload total length
int rtp_rcv_len; // rtp payload receive length
char * rtp_rcv_buf; // rtp payload receive buffer
RCMCH channels[AV_MAX_CHS]; // media channels
HD_AUTH_INFO auth_info; // auth information
int video_codec; // video codec
int audio_codec; // audio codec
int sample_rate; // audio sample rate
int audio_channels; // audio channels
int bit_per_sample; // audio bit per sample
uint8 * audio_spec; // audio special data, for AAC etc.
uint32 audio_spec_len; // audio special data length
#ifdef BACKCHANNEL
int bc_audio_device; // back channel audio device index, start from 0
int bc_audio_codec; // back channel audio codec
int bc_sample_rate; // back channel sample rate
int bc_channels; // back channel channel numbers
int bc_bit_per_sample; // back channel bit per sample
UA_RTP_INFO bc_rtp_info; // back channel audio rtp info
CAudioCapture * audio_captrue; // audio capture
#endif
#ifdef REPLAY
uint32 scale_flag : 1;
uint32 rate_control_flag : 1;
uint32 immediate_flag : 1;
uint32 frame_flag : 1;
uint32 frame_interval_flag : 1;
uint32 range_flag : 1;
uint32 replay_reserved : 26;
int scale; // scale info, when not set the rata control flag, the scale is valid.
// It shall be either 100.0 or -100.0, to indicate forward or reverse playback respectively.
// If it is not present, forward playback is assumed
// 100 means 1.0, Divide by 100 when using
int rate_control; // rate control flag,
// 1-the stream is delivered in real time using standard RTP timing mechanisms
// 0-the stream is delivered as fast as possible, using only the flow control provided by the transport to limit the delivery rate
int immediate; // 1 - immediately start playing from the new location, cancelling any existing PLAY command.
// The first packet sent from the new location shall have the D (discontinuity) bit set in its RTP extension header.
int frame; // 0 - all frames
// 1 - I-frame and P-frame
// 2 - I-frame
int frame_interval; // I-frame interval, unit is milliseconds
time_t replay_start; // replay start time
time_t replay_end; // replay end time
#endif
#ifdef OVER_HTTP
uint16 http_port; // rtsp over http port
HTTPREQ rtsp_send; // rtsp over http get connection
HTTPREQ rtsp_recv; // rtsp over http post connection
#endif
#ifdef OVER_WEBSOCKET
uint16 ws_port; // rtsp over websocket port
HTTPREQ ws_http; // rtsp over websocket connection
WSMSG ws_msg; // rtsp over websocket message handler
#endif
} RCUA;
#ifdef __cplusplus
extern "C" {
#endif
/*************************************************************************/
HRTSP_MSG * rcua_build_describe(RCUA * p_rua);
HRTSP_MSG * rcua_build_setup(RCUA * p_rua,int type);
HRTSP_MSG * rcua_build_play(RCUA * p_rua);
HRTSP_MSG * rcua_build_pause(RCUA * p_rua);
HRTSP_MSG * rcua_build_teardown(RCUA * p_rua);
HRTSP_MSG * rcua_build_get_parameter(RCUA * p_rua);
HRTSP_MSG * rcua_build_options(RCUA * p_rua);
/*************************************************************************/
BOOL rcua_get_media_info(RCUA * p_rua, HRTSP_MSG * rx_msg);
BOOL rcua_get_sdp_video_desc(RCUA * p_rua, const char * key, int * pt, char * p_sdp, int max_len);
BOOL rcua_get_sdp_audio_desc(RCUA * p_rua, const char * key, int * pt, char * p_sdp, int max_len);
BOOL rcua_get_sdp_h264_desc(RCUA * p_rua, int * pt, char * p_sdp, int max_len);
BOOL rcua_get_sdp_h264_params(RCUA * p_rua, int * pt, char * p_sps_pps, int max_len);
BOOL rcua_get_sdp_h265_desc(RCUA * p_rua, int * pt, char * p_sdp, int max_len);
BOOL rcua_get_sdp_h265_params(RCUA * p_rua, int * pt, BOOL * donfield, char * p_vps, int vps_len, char * p_sps, int sps_len, char * p_pps, int pps_len);
BOOL rcua_get_sdp_mp4_desc(RCUA * p_rua, int * pt, char * p_sdp, int max_len);
BOOL rcua_get_sdp_mp4_params(RCUA * p_rua, int * pt, char * p_cfg, int max_len);
BOOL rcua_get_sdp_aac_desc(RCUA * p_rua, int * pt, char * p_sdp, int max_len);
BOOL rcua_get_sdp_aac_params(RCUA * p_rua, int *pt, int *sizelength, int *indexlength, int *indexdeltalength, char * p_cfg, int max_len);
SOCKET rcua_init_udp_connection(uint16 port);
SOCKET rcua_init_mc_connection(uint16 port, char * destination);
/*************************************************************************/
void rcua_send_rtsp_msg(RCUA * p_rua,HRTSP_MSG * tx_msg);
#define rcua_send_free_rtsp_msg(p_rua,tx_msg) \
do { \
rcua_send_rtsp_msg(p_rua,tx_msg); \
rtsp_free_msg(tx_msg); \
} while(0)
#ifdef __cplusplus
}
#endif
#endif // RTSP_RCUA_H