244 lines
9.8 KiB
C
244 lines
9.8 KiB
C
|
|
/***************************************************************************************
|
||
|
|
*
|
||
|
|
* 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
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|