nt9856x/code/lib/source/librtsp/librtsp_note.txt
2023-03-28 15:07:53 +08:00

983 lines
28 KiB
Plaintext
Executable File

1. Test
Result Case
---------------------------------------------------------------------------
OK Init the server.
OK Start the server.
OK Stop the server.
OK Reset the server.
OK Force reset the server.
OK Allocate queues.
OK Release queues.
OK Register streams.
OK Deregister a stream with/without ongoing streaming.
OK Set the file path.
OK VLC.
OK QuickTime player.
OK rtsp_test.
OK Live 1-1
OK Live 1-M
OK Live multiple 1-1
OK Live multiple 1-M
OK Live teardown
OK File 1-1
OK File 1-M
OK File multiple 1-1
OK File multiple 1-M
File pause (not supported by spook)
OK File teardown
OK Abnormal connection termination by clients.
OK Deregister corresponding file stream even if abnormal connection
termination by clients.
OK 135 clients for 47832 seconds.
OK Client listing test.
OK Client listing test with 1 consistent and 19 dynamic clients for
XXXXX seconds.
2. Done by the streaming server:
(1) Close the usock & unlink the file.
(2) STREAM_THREAD_START, STREAM_THREAD_STOP, STREAM_THREAD_RESET.
(3) media enqueue, media flush.
(4) stream deregistration.
(5) SIGKILL.
3. utility functions
global:
config_port
config_rtprange
config_frameheap
rtsp:
set_track
set_path
set_qos
http:
set_input
set_path
set_mode
set_max_cache_time
4. FStreamer.conf (OV7725, 3CH, H264_MP2_640x480_30FPS, MP4_AMR_640x480_30FPS, MJPEG_MP2_640x480_30FPS)
FrameHeap 300 300;
FrameHeap 20 4096;
FrameHeap 20 40000;
FrameHeap 10 80000;
FrameHeap 2 400000;
Port 554;
Authentication 0 10;
RtpRange 50000 60000;
external.c ---
Input External { start_block::ext=(struct ext_input *)malloc()
Format "h264";
CallNumber 201;
Framerate 1 30;
Output h264v1; set_output::struct stream *new_stream(...,ext)
}
Input External {
Format "mpeg4";
CallNumber 202;
Framerate 1 30;
Output mpeg4v2;
}
Input External {
Format "jpeg";
CallNumber 203;
Framerate 1 30;
Output mjpegv3;
}
Input DSP2 {
AudioOutput pcm2;
AudioRate 16000;
AudioChannels 1;
}
Filter Resample2 {
Input "pcm2";
Output "pcm2-8k";
Rate 8000;
Channels 1;
}
Encoder AMRv2 {
Input "pcm2-8k";
Mode MR515;
Output "amrv2";
}
Encoder MP2v2 {
Input "pcm2";
Bitrate 32000;
Output "mp2v2";
}
Record-ch1 Record {
Format "AVI";
Path /mnt/sd/recording ;
Track "h264v1";
Track "mp2v2";
}
Record-ch2 Record {
Format "AVI";
Path /mnt/sd/recording ;
Track "mpeg4v2";
Track "mp2v2";
}
Record-ch3 Record {
Format "AVI";
Path /mnt/sd/recording ;
Track "mjpegv3";
Track "mp2v2";
}
live.c ---
RTSP-Handler Live { start_block::(struct live_source *)malloc()
Path / ; set_path::new_rtsp_location(...,live_open,..)::(struct rtsp_location *)malloc()
Track "h264v1"; set_track::struct stream_destination *connect_to_stream()
struct rtp_media *new_rtp_media_XXX()
Track "mp2v2";
}
live_open() ---
ls = (struct live_session *)malloc()
ls->sess = new_session();
RTSP-Handler Live {
Path /3g ;
Track "h264v1";
Track "amrv2";
}
RTSP-Handler Live {
Path /v2 ;
Track "mpeg4v2";
Track "mp2v2";
}
RTSP-Handler Live {
Path /3gv2 ;
Track "mpeg4v2";
Track "amrv2";
}
RTSP-Handler Live {
Path /v3 ;
Track "mjpegv3";
Track "mp2v2";
}
RTSP-Handler Live {
Path /3gv3 ;
Track "mjpegv3";
Track "amrv2";
}
5.
live_init
start_block, 0x7fd800
start_block, thread 114696
set_path, /, 0x7fd800
set_track, h264v1, 0x7fd800
set_track, mp2v2, 0x7fd800
end_block, 0x7fd800
start_block, 0x801198
set_path, /3g, 0x801198
set_track, h264v1, 0x801198
set_track, amrv2, 0x801198
end_block, 0x801198
next_live_frame
live_loop
next_live_frame
next_live_frame
next_live_frame
6.
Defined in conf_parse.h:
RTCP_ENABLE
GM
STRUCTURE
struct rtsp_location {
struct loc_node node;
char realm[128];
char username[128];
char password[128];
open_func open;
void *private;
};
struct live_source {
struct live_session *sess_list;
struct live_track track[MAX_TRACKS];
int qos;
int safe_I_num;
int curr_I_num;
int I_frame_only;
pthread_t live_thread;
};
struct live_track {
int index;
struct live_source *source;
struct stream_destination *stream;
int ready;
struct rtp_media *rtp;
};
struct live_session {
struct live_session *next;
struct live_session *prev;
struct session *sess;
struct live_source *source;
int playing;
int delay;
};
struct rtsp_session {
struct rtsp_session *next;
struct rtsp_session *prev;
char id[32];
struct session *sess;
};
struct session {
struct session *next;
struct session *prev;
get_sdp_func get_sdp;
setup_func setup;
play_func play;
pause_func pause;
teardown_func teardown;
void *private;
session_close_func control_close;
void *control_private;
struct timeval open_time;
char addr[64];
struct rtp_endpoint *ep[MAX_TRACKS];
int stream_num;
};
struct stream {
struct stream *next;
struct stream *prev;
char name[256];
int format;
struct stream_destination *dest_list;
void (*get_framerate)( struct stream *s, int *fincr, int *fbase );
void (*get_bitrate)( struct stream *s, int *bitrate );
void (*get_framesize)( struct stream *s, int *framesize );
void (*set_running)( struct stream *s, int running );
void *src_private;
};
struct stream_destination {
struct stream_destination *next;
struct stream_destination *prev;
struct stream *stream;
int waiting;
frame_deliver_func process_frame;
void *d;
};
struct rtp_endpoint {
struct session *session;
int payload;
int max_data_size;
unsigned int ssrc;
unsigned int start_timestamp;
unsigned int last_timestamp;
unsigned int sync_timestamp;
unsigned int pre_sync_timestamp;
unsigned int timebase;
short packetskip;
unsigned int delay_time;
short stopdetect;
int seqnum;
int packet_count;
int octet_count;
struct event *rtcp_send_event;
int enable_send_rtcp; //kevin 2007.1.17
int force_rtcp;
int event_enabled;//kevin rtcp enabling flag
struct timeval last_rtcp_recv;
int retry;
int trans_type;
union {
struct {
char sdp_addr[48];
int sdp_port;
int rtp_fd;
struct event *rtp_event;
int rtcp_fd;
struct event *rtcp_event;
struct conn *conn;
int rtp_chan;
} udp;
struct {
struct conn *conn;
int rtp_chan;
int rtcp_chan;
} inter;
} trans;
int enable_send_rtcp_app_motionNty;
int timeSec_rtcp_app_motionNty;
int flyKey;
};
struct conn {
struct conn *next;
struct conn *prev;
int fd;
int second_fd; /* QuickTime uses two TCP connections for tunneling */
struct sockaddr_in client_addr;
struct event *read_event;
struct event *second_read_event; /* for second_fd */
struct event *write_event;
int proto;
char http_tunnel_cookie[128]; /* used to identify QuickTime tunnels */
int base64_count; /* QuickTime uses base64 when tunneling over HTTP */
unsigned char req_buf[4096];
int req_len;
struct req *req_list;
#ifdef NO_MM
unsigned char send_buf[16384];
// unsigned char send_buf[PACKET_SIZE+500];
#else
unsigned char send_buf[65536];
#endif
int send_buf_r;
int send_buf_w;
int drop_after;
void *proto_state;
};
GLOBAL
struct loc_node *rtsp_loc_list
struct stream *stream_list
struct session *sess_list
LOCAL
struct rtsp_session *sess_list; // rtsp.c
// spook_log_init(): Init spook log.
// acl_init(): Init access control list.
// control_init(): Init an unix socket as the control channel.
external_init(): Init external input module.
input external
start_block(): Allocate struct ext_input
set_output():
ext_input.output = (struct stream *) new_stream();
Allocate struct stream.
+ Add allocated struct stream to stream_list.
stream.src_private = &ext_input;
ext_input.output->get_framerate = get_framerate;
ext_input.output->set_running = [static] set_running;
set_format(): Set format (h264/mp4/mjpeg/mpa/amr...).
set_framerate()
set_callnumber(): Set call number (data channel number).
// access_log_init(): Init access log.
dsp1_init(): Init 1st audio channel.
input DSP1
start_block():
Allocate a struct v4l_input.
v4l_input.format = FORMAT_PCM;
set_aout()
v4l_input.aout = (struct stream *) new_stream(..., FORMAT_PCM, &v4l_input);
Allocate struct stream.
+ Add allocated struct stream to stream_list.
stream.src_private = &v4l_input;
set_audiorate()
set_audiochannels()
end_block():
audio = open(AUDIO1, O_RDONLY, 0);
v4l_input.aq = new_soft_queue( 10 );
add_softqueue_event(v4l_input.aq, 0, get_back_audio_frame, &v4l_input);
pthread_create(&v4l_input.audio_thread, NULL, audio_loop, &v4l_input);
dsp2_init(): Init 2nd audio channel
input DSP2
set_aout()
set_audiorate()
set_audiochannels()
// scull_init(all audio channels):
input SCULL1,SCULL2
start_block():
Allocate a struct v4l_input.
v4l_input.format = FORMAT_PCM;
set_aout()
v4l_input.aout = (struct stream *) new_stream(..., FORMAT_PCM, &v4l_input);
Allocate struct stream.
+ Add allocated struct stream to stream_list.
stream.src_private = &v4l_input;
set_audiorate()
set_audiochannels()
end_block():
audio = open(SCULL1, O_RDWR, 0);
v4l_input.aq = new_soft_queue( 10 );
add_softqueue_event(v4l_input.aq, 0, get_back_audio_frame, &v4l_input);
pthread_create(&v4l_input.audio_thread, NULL, audio_loop, &v4l_input);
// mp2_v2_init() as
mp2_init_ext(all audio channels):
encoder mp2v1,mp2v2
start_block():
Allocate a struct mp2_encoder.
set_input():
mp2_encoder.input = (stream_destination *) connect_to_stream(..., mp2_encode, &mp2_encoder, ...);
Find stream.
new_dest(&stream, mp2_encode, &mp2_encoder)
Allocate a struct stream_destination.
+ Add stream_destination to stream.dest_list.
stream_destination.stream = &stream;
stream_destination.process_frame = mp2_encode;
stream_destination.d = &mp2_encoder;
set_output():
mp2_encoder.output = new_stream(..., FORMAT_MPA, &mp2_encoder);
Allocate struct stream.
+ Add allocated struct stream to stream_list.
stream.src_private = &mp2_encoder;
mp2_encoder.output->get_framerate = [static] get_framerate;
mp2_encoder.output->get_bitrate = [static] get_bitrate;
mp2_encoder.output->set_running = [static] set_running;
set_bitrate():
end_block():
MPA_encode_init(&mp2_encoder.ctx, ...);
mp2_encoder.inq = new_soft_queue(16);
mp2_encoder.outq = new_soft_queue(16);
add_softqueue_event(mp2_encoder.outq, 0, [static] get_back_frame, &mp2_encoder);
pthread_create(&mp2_encoder.thread, NULL, mp2_loop, &mp2_encoder);
amr_init_ext(all audio channels):
encoder amrv1,amrv2
start_block():
Allocate a struct amr_encoder.
set_input():
amr_encoder.input = (stream_destination *) connect_to_stream(..., amr_encode, &amr_encoder, ...);
Find stream.
new_dest(&stream, amr_encode, &amr_encoder)
Allocate a struct stream_destination.
+ Add stream_destination to stream.dest_list.
stream_destination.stream = &stream;
stream_destination.process_frame = amr_encode;
stream_destination.d = &amr_encoder;
set_output():
mp2_encoder.output = new_stream(..., FORMAT_AMR, &amr_encoder);
Allocate struct stream.
+ Add allocated struct stream to stream_list.
stream.src_private = &amr_encoder;
amr_encoder.output->set_running = [static] set_running;
set_mode(): AMR475,MR515,MR59,MR67,MR74,MR795,MR102,MR122
end_block():
Speech_Encode_Frame_init(&amr_encoder.speech_encoder_state, ...)
sid_sync_init(&sid_state)
amr_encoder.inq = new_soft_queue(16);
amr_encoder.outq = new_soft_queue(16);
add_softqueue_event(amr_encoder.outq, 0, [static] get_back_frame, &amr_encoder);
pthread_create(&amr_encoder.thread, NULL, amr_loop, &amr_encoder);
live_init()
rtsp-handler live
start_block():
Allocate a struct live_source.
live_source.track[i].index = i;
live_source.track[i].source = &live_source;
if([static] live_loop_thread_created == 0)
pthread_create(&live_source.live_thread), NULL, live_loop, &live_source);
set_path(..., &live_source):
new_rtsp_location(..., live_open, &live_source);
Allocate a struct rtsp_location.
+ Add rtsp_location to rtsp_loc_list.
rtsp_location.open = live_open;
rtsp_location.private = &live_source;
set_track(..., &live_source):
live_source.track[t].stream = (stream_destination *) connect_to_stream(..., next_live_frame, &live_source.track[t],...)
Find stream.
new_dest(&stream, next_live_frame, &live_source.track[t])
Allocate a struct stream_destination.
+ Add stream_destination to stream.dest_list.
stream_destination.stream = &stream;
stream_destination.process_frame = next_live_frame;
stream_destination.d = &live_source.track[t];
case FORMAT_MPEG4:
live_source.track[t].rtp = new_rtp_media_mpeg4();
Allocate a struct rtp_mpeg4.
new_rtp_media(mpeg4_get_sdp, mpeg4_get_payload, mpeg4_process_frame, mpeg4_send, &rtp_mpeg4);
Allocate a struct rtp_media.
...
rtp_media.private = &rtp_mpeg4;
case FORMAT_H264:
live_source.track[t].rtp = new_rtp_media_h264(live_source.track[t].stream->stream);
Allocate a struct rtp_h264.
new_rtp_media(h264_get_sdp, h264_get_payload, h264_process_frame, h264_send, &rtp_h264);
Allocate a struct rtp_media.
...
rtp_media.private = &rtp_h264;
case FORMAT_JPEG:
live_source.track[t].rtp = new_rtp_media_jpeg_stream(live_source.track[t].stream->stream);
Allocate a struct rtp_jpeg.
new_rtp_media(jpeg_get_sdp, jpeg_get_payload, jpeg_process_frame, jpeg_send, &rtp_jpeg);
Allocate a struct rtp_media.
...
rtp_media.private = &rtp_jpeg;
case FORMAT_MPA:
live_source.track[t].rtp = new_rtp_media_mpa(live_source.track[t].stream->stream);
Allocate a struct rtp_mpa.
new_rtp_media(mpa_get_sdp, mpa_get_payload, mpa_process_frame, mpa_send, &rtp_mpa);
Allocate a struct rtp_media.
...
rtp_media.private = &rtp_mpa;
case FORMAT_AMR:
live_source.track[t].rtp = new_rtp_media_amr(live_source.track[t].stream->stream);
Allocate a struct rtp_amr.
new_rtp_media(amr_get_sdp, amr_get_payload, amr_process_frame, amr_send, &rtp_amr);
Allocate a struct rtp_media.
...
rtp_media.private = &rtp_amr;
set_qos(..., &live_source):
end_block(..., &live_source);
Check live_source.track[0].rtp != NULL.
http_init()
output http
start_block():
Allocate a struct http_location.
+ Add http_location to http_loc_list.
set_input():
http_location.input = connect_to_stream(..., jpeg_next_frame, &http_location, FORMAT_JPEG)
Find stream.
new_dest(&stream, jpeg_next_frame, &http_location)
Allocate a struct stream_destination.
+ Add stream_destination to stream.dest_list.
stream_destination.stream = &stream;
stream_destination.process_frame = jpeg_next_frame;
stream_destination.d = &http_location;
set_path():
set_mode():
http_location.streaming = 0 "single" or 1 "stream".
set_max_cache_time():
end_block():
Check http_location.input, http_location.node.path.
read_config_file()
event_loop(0)
handle_OPTIONS():
DESCRIBE, SETUP, TEARDOWN, PLAY
handle_DESCRIBE():
loc = (rtsp_location *) find_rtsp_location(req->req->sl.req.uri, path, NULL)
sess = (struct session *) rtsp_location.open(path, (live_source *)loc->private)
if (0 < sess->get_sdp()) {
if (0 <= tcp_send_pmsg(req->conn, req->resp, sdp_len))
send_data(req->conn, sdp, sdp_len);
}
sess->teardown(sess, NULL);
handle_SETUP():
loc = (rtsp_location *) find_rtsp_location( req->req->sl.req.uri, path, &track)
if SESSION
rs = (struct rtsp_session *) get_session(SESSION)
s = rs->sess
else
s = (structure session *) loc->open(path, (live_source *) loc->private) [live_open]
Allocate a struct live_session.
live_source.sess_list = &live_session;
live_session.sess = new_session();
Allocate a struct session.
+ Add session to sess_list.
live_session.source = &live_source;
...
live_session.sess->private = &live_session;
return live_session.sess;
s->setup(s, track) [live_setup]
s->ep[t] = new_rtp_endpoint(payload);
Allocate a struct rtp_endpoint.
if RTCP_ENABLE & Video
rtp_endpoint.rtcp_send_event = add_timer_event(30000, 0, rtcp_app_fire, &rtp_endpoint);
set_event_enabled(rtp_endpoint.rtcp_send_event, 0 );
s->ep[t]->session = s;
s->ep[t]->flyKey = getFlyKey(ls->source->track[t].stream->stream->name);
if RTP/AVP/TCP
ret = rtsp_interleave_setup(s, track, req, t);
Allocate a struct rtsp_conn.
req->conn->proto_state = &rtsp_conn;
rtsp_conn.ichan[rtp_chan].ep = s->ep[track];
rtsp_conn.ichan[rtp_chan].rtcp = 0;
if RTCP_ENABLE
rtsp_conn.ichan[rtcp_chan].ep = s->ep[track];
rtsp_conn.ichan[rtcp_chan].rtcp = 1;
endif
connect_interleaved_endpoint(s->ep[track], req->conn, rtp_chan, rtcp_chan);
else
ret = rtsp_udp_setup(s, track, req, t);
if (ret < 0)
s->teardown(s, s->ep[track]); [live_teardown]
else
tcp_send_pmsg(req->conn, req->resp, -1);
if(!rs) rs = new_rtsp_session(struct session *);
Allocate a struct rtsp_session.
Add rtsp_session to sess_list[local].
rtsp.session.sess = &session;
session->control_private = &rtsp_session;
session->control_close = rtsp_session_close();
handle_SET_PARAMETER():
handle_GET_PARAMETER():
handle_PLAY():
rs = (struct rtsp_session *) get_session(get_header(req->req, "Session"))
rs->sess->play(rs->sess, have_start ? &start : NULL); [live_play]
ls = (struct live_session *)s->private;
For each active tracks
set_waiting(ls->source->track[t].stream, 1);
tcp_send_pmsg(req->conn, req->resp, -1);
handle_PAUSE():
handle_TEARDOWN():
loc = (rtsp_location *) find_rtsp_location( req->req->sl.req.uri, NULL, &track)
rs = (struct rtsp_session *) get_session(get_header( req->req, "Session"))
tcp_send_pmsg(req->conn, req->resp, -1);
rs->sess->teardown( rs->sess, track < 0 ? NULL : rs->sess->ep[track]); [live_teardown]
ls = (struct live_session *)s->private;
For each ative track
del_rtp_endpoint(s->ep[i]);
if RTCP_ENABLE
remove_event(ep->rtcp_send_event);
case RTP_TRANS_UDP:
remove_event(ep->trans.udp.rtp_event);
close(ep->trans.udp.rtp_fd);
if RTCP_ENABLE
remove_event(ep->trans.udp.rtcp_event);
close(ep->trans.udp.rtcp_fd);
interleave_disconnect(ep->trans.udp.conn, ep->trans.udp.rtp_chan);
case RTP_TRANS_INTER:
interleave_disconnect(ep->trans.inter.conn, ep->trans.inter.rtp_chan);
ifd RTCP_ENABLE
interleave_disconnect(ep->trans.inter.conn, ep->trans.inter.rtcp_chan);
free( ep );
track_check_running(ls->source, i);
if (remaining == 0)
Free ls.
del_session((struct session *) sess);
Remove sess from sess_list.
sess->control_close(sess); [rtsp_session_close]
rs = (struct rtsp_session *) sess->control_private;
Remove sess from sess_list ???
Free rs.
Free sess.
7. RTSP session examples
(1) VLC
OPTIONS rtsp://192.168.68.236:554/live/ch09 RTSP/1.0
CSeq: 7
User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20)
RTSP/1.0 200 OK
CSeq: 7
Server: VStream Streaming Server V1.0
Public: DESCRIBE, SETUP, TEARDOWN, PLAY
DESCRIBE rtsp://192.168.68.236:554/live/ch09 RTSP/1.0
CSeq: 8
Accept: application/sdp
User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20)
RTSP/1.0 200 OK
CSeq: 8
Server: VStream Streaming Server V1.0
Content-Base: rtsp://192.168.68.236:554/live/ch09/
Content-Type: application/sdp
Content-Length: 355
SETUP rtsp://192.168.68.236:554/live/ch09/trackID=0 RTSP/1.0
CSeq: 9
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20)
RTSP/1.0 200 OK
CSeq: 9
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
Session: A6843ED31907451D9E91
SETUP rtsp://192.168.68.236:554/live/ch09/trackID=1 RTSP/1.0
CSeq: 10
Transport: RTP/AVP/TCP;unicast;interleaved=2-3
Session: A6843ED31907451D9E91
User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20)
RTSP/1.0 200 OK
CSeq: 10
Transport: RTP/AVP/TCP;unicast;interleaved=2-3
Session: A6843ED31907451D9E91
PLAY rtsp://192.168.68.236:554/live/ch09/ RTSP/1.0
CSeq: 11
Session: A6843ED31907451D9E91
Range: npt=0.000-
User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20)
RTSP/1.0 200 OK
CSeq: 11
Session: A6843ED31907451D9E91
Range: npt=now-
RTP-Info: url=rtsp://192.168.68.236:554/live/ch09//trackID=0;seq=14535;rtptime=0,url=rtsp://192.168.68.236:554/live/ch09//trackID=1;seq=6167;rtptime=0
TEARDOWN rtsp://192.168.68.236:554/live/ch09/ RTSP/1.0
CSeq: 12
Session: A6843ED31907451D9E91
User-Agent: VLC media player (LIVE555 Streaming Media v2009.04.20)
RTSP/1.0 200 OK
CSeq: 12
Session: A6843ED31907451D9E91
(2) QuickTime
DESCRIBE rtsp://192.168.68.236:554/file/2009-12-14.avi RTSP/1.0
CSeq: 1
Accept: application/sdp
Bandwidth: 2147483647
Accept-Language: en-GB
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
RTSP/1.0 200 OK
CSeq: 1
Server: VStream Streaming Server V1.0
Content-Base: rtsp://192.168.68.236:554/file/2009-12-14.avi/
Content-Type: application/sdp
Content-Length: 351
SETUP rtsp://192.168.68.236:554/file/2009-12-14.avi/trackID=0 RTSP/1.0
CSeq: 2
Transport: RTP/AVP/TCP;unicast
x-dynamic-rate: 1
x-transport-options: late-tolerance=2.900000
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
Accept-Language: en-GB
RTSP/1.0 200 OK
CSeq: 2
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
Session: C85B60A2961D9DE3AC08
SETUP rtsp://192.168.68.236:554/file/2009-12-14.avi/trackID=1 RTSP/1.0
CSeq: 3
Transport: RTP/AVP/TCP;unicast
x-dynamic-rate: 1
x-transport-options: late-tolerance=2.900000
Session: C85B60A2961D9DE3AC08
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
Accept-Language: en-GB
RTSP/1.0 200 OK
CSeq: 3
Transport: RTP/AVP/TCP;unicast;interleaved=2-3
Session: C85B60A2961D9DE3AC08
PLAY rtsp://192.168.68.236:554/file/2009-12-14.avi RTSP/1.0
CSeq: 4
Range: npt=0.000000-
x-prebuffer: maxtime=2.000000
Session: C85B60A2961D9DE3AC08
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
RTSP/1.0 200 OK
CSeq: 4
Session: C85B60A2961D9DE3AC08
Range: npt=now-
RTP-Info: url=rtsp://192.168.68.236:554/file/2009-12-14.avi/trackID=0;seq=9332;rtptime=0,url=rtsp://192.168.68.236:554/file/2009-12-14.avi/trackID=1;seq=1469;rtptime=0
PAUSE rtsp://192.168.68.236:554/file/2009-12-14.avi RTSP/1.0
CSeq: 5
Session: C85B60A2961D9DE3AC08
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
RTSP/1.0 200 OK
CSeq: 5
Session: C85B60A2961D9DE3AC08
PLAY rtsp://192.168.68.236:554/file/2009-12-14.avi RTSP/1.0
CSeq: 6
Range: npt=8.753333-
x-prebuffer: maxtime=2.000000
Session: C85B60A2961D9DE3AC08
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
RTSP/1.0 200 OK
CSeq: 6
Session: C85B60A2961D9DE3AC08
Range: npt=now-
RTP-Info: url=rtsp://192.168.68.236:554/file/2009-12-14.avi/trackID=0;seq=10048;rtptime=0,url=rtsp://192.168.68.236:554/file/2009-12-14.avi/trackID=1;seq=2058;rtptime=0
PAUSE rtsp://192.168.68.236:554/file/2009-12-14.avi RTSP/1.0
CSeq: 7
Session: C85B60A2961D9DE3AC08
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
RTSP/1.0 200 OK
CSeq: 7
Session: C85B60A2961D9DE3AC08
TEARDOWN rtsp://192.168.68.236:554/file/2009-12-14.avi RTSP/1.0
CSeq: 8
Session: C85B60A2961D9DE3AC08
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
RTSP/1.0 200 OK
CSeq: 8
Session: C85B60A2961D9DE3AC08
8.
-------------------------------------------------------------------------------
1. QT PLAY->PAUSE
handle_DESCRIBE
describe the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi'
handle_SETUP
handle_SETUP
handle_PLAY
play the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi'
handle_PAUSE
handle_TEARDOWN
drop_conn(RTSP)
drop_conn: ep NULL
QT PLAY->QUIT
handle_DESCRIBE
describe the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi'
handle_SETUP
handle_SETUP
handle_PLAY
play the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi'
handle_PAUSE
handle_TEARDOWN
drop_conn(RTSP)
drop_conn: ep NULL
VLC PLAY->PAUSE
handle_DESCRIBE
handle_SETUP
handle_SETUP
handle_PLAY
play the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi/'
VLC PLAY->STOP
handle_DESCRIBE
describe the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi'
handle_SETUP
handle_SETUP
handle_PLAY
play the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi/'
handle_TEARDOWN
before teardown()
stop the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi/'
exec_ipc_cmd: GMSS_CMD_DEREG(16)
drop_conn(RTSP)
drop_conn: ep NULL
VLC PLAY->QUIT
handle_DESCRIBE
describe the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi'
handle_SETUP
handle_SETUP
handle_PLAY
play the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi/'
handle_TEARDOWN
before teardown()
stop the file 'rtsp://192.168.68.236:554/file/2009-12-02.avi/'
exec_ipc_cmd: GMSS_CMD_DEREG(16)
drop_conn(RTSP)
drop_conn: ep NULL
rtsp_test PLAY->QUIT
handle_DESCRIBE
describe the file 'rtsp://127.0.0.1:554/file/2009-12-02.avi'
handle_SETUP
handle_SETUP
handle_PLAY
play the file 'rtsp://127.0.0.1:554/file/2009-12-02.avi'
drop_conn(RTSP)
drop_conn: live_source 0x9bf6208
rtsp_conn_disconnect:ichan[0].ep 0x9bf4ee8, rtcp 0
rtsp_conn_disconnect:ichan[2].ep 0x9b58a68, rtcp 0
2.
PLAY rtsp://192.168.68.236:554/file/20091201.avi RTSP/1.0
CSeq: 4
Range: npt=0.000000-
x-prebuffer: maxtime=2.000000
Session: E6D2932B527898EF618A
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
RTSP/1.0 200 OK
CSeq: 4
Session: E6D2932B527898EF618A
Range: npt=now-
RTP-Info: url=rtsp://192.168.68.236:554/file/20091201.avi/trackID=0;seq=25237;rtptime=0,url=rtsp://192.168.68.236:554/file/20091201.avi/trackID=1;seq=5581;rtptime=0
PAUSE rtsp://192.168.68.236:554/file/20091201.avi RTSP/1.0
CSeq: 5
Session: E6D2932B527898EF618A
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
RTSP/1.0 200 OK
CSeq: 5
Session: E6D2932B527898EF618A
PLAY rtsp://192.168.68.236:554/file/20091201.avi RTSP/1.0
CSeq: 6
Range: npt=74.141667-
x-prebuffer: maxtime=2.000000
Session: E6D2932B527898EF618A
User-Agent: QuickTime/7.5.5 (qtver=7.5.5;os=Windows NT 5.1Service Pack 3)
RTSP/1.0 200 OK
CSeq: 6
Session: E6D2932B527898EF618A
Range: npt=74.141667-
RTP-Info: url=rtsp://192.168.68.236:554/file/20091201.avi/trackID=0;seq=30225,url=rtsp://192.168.68.236:554/file/20091201.avi/trackID=1;seq=6679
===============================================================================
event.c
static struct event *time_event_list = NULL;
static struct event *fd_event_list = NULL;
static struct event *always_event_list = NULL;
http.c
static struct http_location *http_loc_list = NULL;
rtsp.c
static struct rtsp_location *rtsp_loc_list = NULL;
static struct rtsp_session *sess_list = NULL;
session.c
static struct session *sess_list = NULL;
stream.c
static struct stream *stream_list = NULL;
tcp.c
struct listener *listener = NULL;
static struct conn *conn_list = NULL;