doubao_chat/include_lib/net/streaming_media_server/fenice/rtsp.h

185 lines
5.2 KiB
C

/* *
* $Id: rtsp.h 395 2006-10-05 16:08:10Z shawill $
*
* This file is part of Fenice
*
* Fenice -- Open Media Server
*
* Copyright (C) 2004 by
*
* - Giampaolo Mancini <giampaolo.mancini@polito.it>
* - Francesco Varano <francesco.varano@polito.it>
* - Marco Penno <marco.penno@polito.it>
* - Federico Ridolfo <federico.ridolfo@polito.it>
* - Eugenio Menegatti <m.eu@libero.it>
* - Stefano Cau
* - Giuliano Emma
* - Stefano Oldrini
*
* Fenice is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Fenice is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Fenice; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* */
#ifndef _RTSPH
#define _RTSPH
#include "../fenice_config.h"
#include "utils.h"
#include "socket.h"
#include "rtp.h"
#include "rtcp.h"
#include "mediainfo.h"
#include "schedule.h"
#define RTSP_BUFFERSIZE 1472
/* Stati della macchina a stati del server rtsp */
#define INIT_STATE 0
#define READY_STATE 1
#define PLAY_STATE 2
#define RTSP_VER "RTSP/1.0"
#define RTSP_EL "\r\n"
#define RTSP_RTP_AVP "RTP/AVP"
typedef enum _RTSP_proto {
TCP,
SCTP
} RTSP_proto;
typedef struct _RTSP_interleaved {
int rtp_fd; //!< output rtp local socket
int rtcp_fd; //!< output rtcp local socket
union {
struct {
uint16 rtp_ch;
uint16 rtcp_ch;
} tcp;
struct {
uint16 rtp_st;
uint16 rtcp_st;
} sctp;
} proto;
struct _RTSP_interleaved *next;
} RTSP_interleaved;
typedef struct _RTSP_session {
//tsocket fd;
int cur_state;
int session_id;
RTP_session *rtp_session;
struct _RTSP_session *next;
} RTSP_session;
typedef struct _RTSP_buffer {
tsocket fd;
struct sockaddr_in dest_addr;
RTSP_proto proto;
unsigned int port;
// Buffers
char in_buffer[RTSP_BUFFERSIZE];
size_t in_size;
char out_buffer[RTSP_BUFFERSIZE + MAX_DESCR_LENGTH];
size_t out_size;
size_t out_sent;
/* vars for interleaved data:
* interleaved pkts will be present only at the beginning of out_buffer.
* this size is used to remenber how much data should be grouped in one
* pkt with MSG_MORE flag.
* */
RTSP_interleaved *interleaved;
// Run-Time
unsigned int rtsp_cseq;
char descr[MAX_DESCR_LENGTH]; // La descrizione
RTSP_session *session_list;
struct _RTSP_buffer *next;
} RTSP_buffer;
// Interfacce
void RTSP_state_machine(RTSP_buffer *rtsp, int method_code);
//Commuta di stato sulla base di rtsp->current_state e gestisce lo stato stesso.
int RTSP_describe(RTSP_buffer *rtsp);
//Non alloca nessuna risorsa. Risponde al client con la descrizione SDP della URL.
int RTSP_setup(RTSP_buffer *rtsp, RTSP_session **new_session);
//Alloca le risorse di uno stream.
int RTSP_play(RTSP_buffer *rtsp);
// Riproduce uno stream sulla base dei parametri indicati.
int RTSP_pause(RTSP_buffer *rtsp);
//Interrompe momentaneamente uno stream.
int RTSP_teardown(RTSP_buffer *rtsp);
// Termina uno stream
int RTSP_options(RTSP_buffer *rtsp);
int RTSP_handler(RTSP_buffer *rtsp);
// RTSP input buffer parser routine. Return -1 on error.
// RTSP parsing helper functions
#define RTSP_not_full 0
#define RTSP_method_rcvd 1
#define RTSP_interlvd_rcvd 2
int RTSP_full_msg_rcvd(RTSP_buffer *rtsp, int *hdr_len, int *body_len);
#define RTSP_msg_len RTSP_full_msg_rcvd
void RTSP_discard_msg(RTSP_buffer *rtsp);
void RTSP_remove_msg(int len, RTSP_buffer *rtsp);
// void RTSP_msg_len(int *hdr_len,int *body_len,RTSP_buffer *rtsp);
int RTSP_valid_response_msg(unsigned short *status, char *msg,
RTSP_buffer *rtsp);
int RTSP_validate_method(RTSP_buffer *rtsp);
void RTSP_initserver(RTSP_buffer *rtsp, tsocket fd, struct sockaddr_in *dest_addr, RTSP_proto proto);
// DESCRIBE
int send_describe_reply(RTSP_buffer *rtsp, char *object,
description_format descr_format, char *descr);
// REDIRECT 3xx
uint32 send_redirect_3xx(RTSP_buffer *, char *);
// SETUP
int send_setup_reply(RTSP_buffer *rtsp, RTSP_session *session,
SD_descr *descr, RTP_session *sp2);
// TEARDOWN
int send_teardown_reply(RTSP_buffer *rtsp, long session_id, long cseq);
// PLAY
int send_play_reply(RTSP_buffer *rtsp, char *object,
RTSP_session *rtsp_session);
// PAUSE
int send_pause_reply(RTSP_buffer *rtsp, RTSP_session *rtsp_session);
// OPTIONS
int send_options_reply(RTSP_buffer *rtsp, long cseq);
// messages functions
int max_connection();
char *get_stat(int err);
int send_reply(int err, char *addon, RTSP_buffer *rtsp);
int bwrite(char *buffer, unsigned short len, RTSP_buffer *rtsp);
void add_time_stamp(char *b, int crlf);
// low level funcntions
ssize_t RTSP_send(RTSP_buffer *rtsp);
#endif