mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	add bandcheck code and modified srs code for merge
This commit is contained in:
		
							parent
							
								
									adb169eaf1
								
							
						
					
					
						commit
						9a70ce7865
					
				
					 13 changed files with 119 additions and 104 deletions
				
			
		| 
						 | 
					@ -8,16 +8,18 @@ log_dir             ./objs/logs;
 | 
				
			||||||
# if exceed the max connections, server will drop the new connection.
 | 
					# if exceed the max connections, server will drop the new connection.
 | 
				
			||||||
# default: 2000
 | 
					# default: 2000
 | 
				
			||||||
max_connections     2000;
 | 
					max_connections     2000;
 | 
				
			||||||
 | 
					# the default chunk size is 128, max is 65536,
 | 
				
			||||||
 | 
					# some client does not support chunk size change,
 | 
				
			||||||
 | 
					# however, most clients supports it and it can improve 
 | 
				
			||||||
 | 
					# performance about 10%.
 | 
				
			||||||
 | 
					# if not specified, set to 4096.
 | 
				
			||||||
 | 
					# priority of chunk size in vhost > priority of chunk size in global.
 | 
				
			||||||
 | 
					chunk_size		65000;
 | 
				
			||||||
# vhost list, the __defaultVhost__ is the default vhost
 | 
					# vhost list, the __defaultVhost__ is the default vhost
 | 
				
			||||||
# for example, user use ip to access the stream: rtmp://192.168.1.2/live/livestream.
 | 
					# for example, user use ip to access the stream: rtmp://192.168.1.2/live/livestream.
 | 
				
			||||||
# for which cannot identify the required vhost.
 | 
					# for which cannot identify the required vhost.
 | 
				
			||||||
# for default demo.
 | 
					# for default demo.
 | 
				
			||||||
vhost __defaultVhost__ {
 | 
					vhost __defaultVhost__ {
 | 
				
			||||||
	# the default chunk size is 128, max is 65536,
 | 
					 | 
				
			||||||
	# some client does not support chunk size change,
 | 
					 | 
				
			||||||
	# however, most clients supports it and it can improve 
 | 
					 | 
				
			||||||
	# performance about 10%.
 | 
					 | 
				
			||||||
	# if not specified, set to 4096.
 | 
					 | 
				
			||||||
	chunk_size		65000;
 | 
						chunk_size		65000;
 | 
				
			||||||
    enabled         on;
 | 
					    enabled         on;
 | 
				
			||||||
    gop_cache       on;
 | 
					    gop_cache       on;
 | 
				
			||||||
| 
						 | 
					@ -157,9 +159,8 @@ vhost bandcheck.srs.com {
 | 
				
			||||||
	bandcheck{
 | 
						bandcheck{
 | 
				
			||||||
		enabled			on;
 | 
							enabled			on;
 | 
				
			||||||
		key             test kate;
 | 
							key             test kate;
 | 
				
			||||||
		interval		30;
 | 
							interval		5;
 | 
				
			||||||
		max_play_kbps   45000;
 | 
							limit_kbps		4000;
 | 
				
			||||||
		max_pub_kbps    25000;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -747,4 +748,3 @@ pithy_print {
 | 
				
			||||||
    hls            3000;
 | 
					    hls            3000;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
The MIT License (MIT)
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2013 winlin
 | 
					Copyright (c) 2013 winlin
 | 
				
			||||||
 | 
					Copyright (c) 2013 wenjiegit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
this software and associated documentation files (the "Software"), to deal in
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
The MIT License (MIT)
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2013 winlin
 | 
					Copyright (c) 2013 winlin
 | 
				
			||||||
 | 
					Copyright (c) 2013 wenjiegit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
this software and associated documentation files (the "Software"), to deal in
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
| 
						 | 
					@ -78,8 +79,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
#define RTMP_SIG_SRS_WEB "http://blog.csdn.net/win_lin"
 | 
					#define RTMP_SIG_SRS_WEB "http://blog.csdn.net/win_lin"
 | 
				
			||||||
#define RTMP_SIG_SRS_EMAIL "winterserver@126.com"
 | 
					#define RTMP_SIG_SRS_EMAIL "winterserver@126.com"
 | 
				
			||||||
#define RTMP_SIG_SRS_LICENSE "The MIT License (MIT)"
 | 
					#define RTMP_SIG_SRS_LICENSE "The MIT License (MIT)"
 | 
				
			||||||
#define RTMP_SIG_SRS_COPYRIGHT "Copyright (c) 2013 winlin"
 | 
					#define RTMP_SIG_SRS_COPYRIGHT "Copyright (c) 2013 winlin,wenjiegit"
 | 
				
			||||||
#define RTMP_SIG_SRS_CONTRIBUTOR "winlin"
 | 
					#define RTMP_SIG_SRS_CONTRIBUTOR "winlin,wenjiegit"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// compare
 | 
					// compare
 | 
				
			||||||
#define srs_min(a, b) (((a) < (b))? (a) : (b))
 | 
					#define srs_min(a, b) (((a) < (b))? (a) : (b))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
The MIT License (MIT)
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2013 winlin
 | 
					Copyright (c) 2013 winlin
 | 
				
			||||||
 | 
					Copyright (c) 2013 wenjiegit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
this software and associated documentation files (the "Software"), to deal in
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
| 
						 | 
					@ -153,32 +154,35 @@ int SrsClient::service_cycle()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	srs_verbose("set peer bandwidth success");
 | 
						srs_verbose("set peer bandwidth success");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if(config->get_bw_check_enabled(req->vhost, req->bw_key))
 | 
					    if (config->get_bw_check_enabled(req->vhost, req->bw_key)) {
 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        static int64_t last_check_time_ms = srs_get_system_time_ms();
 | 
					        static int64_t last_check_time_ms = srs_get_system_time_ms();
 | 
				
			||||||
        int64_t interval_ms = 0;
 | 
					        int64_t interval_ms = 0;
 | 
				
			||||||
        int     play_kbps   = 0;
 | 
					        int     limit_kbps   = 0;
 | 
				
			||||||
        int     pub_kbps    = 0;
 | 
					
 | 
				
			||||||
        config->get_bw_check_settings(req->vhost, interval_ms, play_kbps, pub_kbps);
 | 
					        config->get_bw_check_settings(req->vhost, interval_ms, limit_kbps);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if((srs_get_system_time_ms() - last_check_time_ms) < interval_ms
 | 
					        if((srs_get_system_time_ms() - last_check_time_ms) < interval_ms
 | 
				
			||||||
                && last_check_time_ms != srs_get_system_time_ms())
 | 
					                && last_check_time_ms != srs_get_system_time_ms())
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            srs_trace("bandcheck interval less than limted interval. last time=%lld, current time=%lld"
 | 
					            srs_trace("bandcheck interval less than limted interval. last time=%lld, current time=%lld"
 | 
				
			||||||
                      , last_check_time_ms, srs_get_system_time_ms());
 | 
					                      , last_check_time_ms, srs_get_system_time_ms());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            return rtmp->response_connect_reject(req, "your bandcheck frequency is too high!");
 | 
					            return rtmp->response_connect_reject(req, "your bandcheck frequency is too high!");
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            last_check_time_ms = srs_get_system_time_ms();  // update last check time
 | 
					            last_check_time_ms = srs_get_system_time_ms();  // update last check time
 | 
				
			||||||
            char* local_ip = 0;
 | 
					            char* local_ip = 0;
 | 
				
			||||||
            if((ret = get_local_ip(local_ip)) != ERROR_SUCCESS){
 | 
					
 | 
				
			||||||
 | 
					            if ((ret = get_local_ip(local_ip)) != ERROR_SUCCESS) {
 | 
				
			||||||
                srs_error("get local ip failed. ret = %d", ret);
 | 
					                srs_error("get local ip failed. ret = %d", ret);
 | 
				
			||||||
                return ret;
 | 
					                return ret;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if ((ret = rtmp->response_connect_app(req, local_ip)) != ERROR_SUCCESS) {
 | 
					            if ((ret = rtmp->response_connect_app(req, local_ip)) != ERROR_SUCCESS) {
 | 
				
			||||||
                srs_error("response connect app failed. ret=%d", ret);
 | 
					                srs_error("response connect app failed. ret=%d", ret);
 | 
				
			||||||
                return ret;
 | 
					                return ret;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return rtmp->start_bandwidth_check(play_kbps, pub_kbps);
 | 
					
 | 
				
			||||||
 | 
					            return rtmp->start_bandwidth_check(limit_kbps);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
| 
						 | 
					@ -203,7 +207,7 @@ int SrsClient::service_cycle()
 | 
				
			||||||
	req->strip();
 | 
						req->strip();
 | 
				
			||||||
	srs_trace("identify client success. type=%d, stream_name=%s", type, req->stream.c_str());
 | 
						srs_trace("identify client success. type=%d, stream_name=%s", type, req->stream.c_str());
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	int chunk_size = config->get_chunk_size();
 | 
					    int chunk_size = config->get_chunk_size(req->vhost);
 | 
				
			||||||
	if ((ret = rtmp->set_chunk_size(chunk_size)) != ERROR_SUCCESS) {
 | 
						if ((ret = rtmp->set_chunk_size(chunk_size)) != ERROR_SUCCESS) {
 | 
				
			||||||
		srs_error("set chunk_size=%d failed. ret=%d", chunk_size, ret);
 | 
							srs_error("set chunk_size=%d failed. ret=%d", chunk_size, ret);
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
The MIT License (MIT)
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2013 winlin
 | 
					Copyright (c) 2013 winlin
 | 
				
			||||||
 | 
					Copyright (c) 2013 wenjiegit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
this software and associated documentation files (the "Software"), to deal in
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
The MIT License (MIT)
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2013 winlin
 | 
					Copyright (c) 2013 winlin
 | 
				
			||||||
 | 
					Copyright (c) 2013 wenjiegit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
this software and associated documentation files (the "Software"), to deal in
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
| 
						 | 
					@ -1449,7 +1450,23 @@ int SrsConfig::get_chunk_size()
 | 
				
			||||||
		return SRS_CONF_DEFAULT_CHUNK_SIZE;
 | 
							return SRS_CONF_DEFAULT_CHUNK_SIZE;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	return ::atoi(conf->arg0().c_str());
 | 
					    return ::atoi(conf->arg0().c_str());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int SrsConfig::get_chunk_size(const std::string &vhost)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SrsConfDirective* conf = get_vhost(vhost);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!conf) {
 | 
				
			||||||
 | 
					        return get_chunk_size();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SrsConfDirective* conf_vhost = conf->get("chunk_size");
 | 
				
			||||||
 | 
					    if (!conf_vhost) {
 | 
				
			||||||
 | 
					        return get_chunk_size();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ::atoi(conf_vhost->arg0().c_str());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SrsConfig::get_pithy_print_publish()
 | 
					int SrsConfig::get_pithy_print_publish()
 | 
				
			||||||
| 
						 | 
					@ -1524,12 +1541,11 @@ bool SrsConfig::get_bw_check_enabled(const std::string &vhost, const std::string
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SrsConfig::get_bw_check_settings(const std::string &vhost, int64_t &interval_ms, int &play_kbps, int &pub_kbps)
 | 
					void SrsConfig::get_bw_check_settings(const std::string &vhost, int64_t &interval_ms, int &limit_kbps)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    // set default value;
 | 
					    // set default value;
 | 
				
			||||||
    interval_ms = 30 * 1000;
 | 
					    interval_ms = 30 * 1000;
 | 
				
			||||||
    play_kbps   = 45000;
 | 
					    limit_kbps   = 32000;
 | 
				
			||||||
    pub_kbps    = 25000;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SrsConfDirective* conf = get_vhost(vhost);
 | 
					    SrsConfDirective* conf = get_vhost(vhost);
 | 
				
			||||||
    if (!conf) {
 | 
					    if (!conf) {
 | 
				
			||||||
| 
						 | 
					@ -1537,20 +1553,19 @@ void SrsConfig::get_bw_check_settings(const std::string &vhost, int64_t &interva
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SrsConfDirective* bw_test = conf->get("bandcheck");
 | 
					    SrsConfDirective* bw_test = conf->get("bandcheck");
 | 
				
			||||||
    if(!bw_test)
 | 
					    if (!bw_test) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SrsConfDirective* interval_conf = bw_test->get("interval");
 | 
					    SrsConfDirective* interval_conf = bw_test->get("interval");
 | 
				
			||||||
    if(interval_conf)
 | 
					    if (interval_conf) {
 | 
				
			||||||
        interval_ms = ::atoll(interval_conf->arg0().c_str()) * 1000;
 | 
					        interval_ms = ::atoll(interval_conf->arg0().c_str()) * 1000;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SrsConfDirective* play_conf = bw_test->get("max_play_kbps");
 | 
					    SrsConfDirective* limit_kbps_conf = bw_test->get("limit_kbps");
 | 
				
			||||||
    if(play_conf)
 | 
					    if (limit_kbps_conf) {
 | 
				
			||||||
        play_kbps = ::atoi(play_conf->arg0().c_str());
 | 
					        limit_kbps = ::atoi(limit_kbps_conf->arg0().c_str());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    SrsConfDirective* pub_conf = bw_test->get("max_pub_kbps");
 | 
					 | 
				
			||||||
    if(pub_conf)
 | 
					 | 
				
			||||||
        pub_kbps = ::atoi(pub_conf->arg0().c_str());
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SrsConfig::get_pithy_print_encoder()
 | 
					int SrsConfig::get_pithy_print_encoder()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
The MIT License (MIT)
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2013 winlin
 | 
					Copyright (c) 2013 winlin
 | 
				
			||||||
 | 
					Copyright (c) 2013 wenjiegit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
this software and associated documentation files (the "Software"), to deal in
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
| 
						 | 
					@ -164,13 +165,14 @@ public:
 | 
				
			||||||
	virtual SrsConfDirective*	get_refer_publish(std::string vhost);
 | 
						virtual SrsConfDirective*	get_refer_publish(std::string vhost);
 | 
				
			||||||
	virtual SrsConfDirective*	get_listen();
 | 
						virtual SrsConfDirective*	get_listen();
 | 
				
			||||||
	virtual int					get_chunk_size();
 | 
						virtual int					get_chunk_size();
 | 
				
			||||||
 | 
					    virtual int					get_chunk_size(const std::string& vhost);
 | 
				
			||||||
	virtual int					get_pithy_print_publish();
 | 
						virtual int					get_pithy_print_publish();
 | 
				
			||||||
	virtual int					get_pithy_print_forwarder();
 | 
						virtual int					get_pithy_print_forwarder();
 | 
				
			||||||
	virtual int					get_pithy_print_encoder();
 | 
						virtual int					get_pithy_print_encoder();
 | 
				
			||||||
	virtual int					get_pithy_print_hls();
 | 
						virtual int					get_pithy_print_hls();
 | 
				
			||||||
	virtual int					get_pithy_print_play();
 | 
						virtual int					get_pithy_print_play();
 | 
				
			||||||
    virtual bool                get_bw_check_enabled(const std::string &vhost, const std::string &key);
 | 
					    virtual bool                get_bw_check_enabled(const std::string &vhost, const std::string &key);
 | 
				
			||||||
    virtual void                get_bw_check_settings(const std::string &vhost, int64_t &interval_ms, int &play_kbps, int &pub_kbps);
 | 
					    virtual void                get_bw_check_settings(const std::string &vhost, int64_t &interval_ms, int &limit_kbps);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										0
									
								
								trunk/src/core/srs_core_error.cpp
									
										
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										0
									
								
								trunk/src/core/srs_core_error.cpp
									
										
									
									
									
										
										
										Normal file → Executable file
									
								
							| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
The MIT License (MIT)
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2013 winlin
 | 
					Copyright (c) 2013 winlin
 | 
				
			||||||
 | 
					Copyright (c) 2013 wenjiegit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
this software and associated documentation files (the "Software"), to deal in
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
| 
						 | 
					@ -51,7 +52,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
#define ERROR_SOCKET_WRITE				209
 | 
					#define ERROR_SOCKET_WRITE				209
 | 
				
			||||||
#define ERROR_SOCKET_WAIT				210
 | 
					#define ERROR_SOCKET_WAIT				210
 | 
				
			||||||
#define ERROR_SOCKET_TIMEOUT			211
 | 
					#define ERROR_SOCKET_TIMEOUT			211
 | 
				
			||||||
#define ERROR_SOCKET_GET_LOCAL_IP       222
 | 
					#define ERROR_SOCKET_GET_LOCAL_IP       212
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ERROR_RTMP_PLAIN_REQUIRED		300
 | 
					#define ERROR_RTMP_PLAIN_REQUIRED		300
 | 
				
			||||||
#define ERROR_RTMP_CHUNK_START			301
 | 
					#define ERROR_RTMP_CHUNK_START			301
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
The MIT License (MIT)
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2013 winlin
 | 
					Copyright (c) 2013 winlin
 | 
				
			||||||
 | 
					Copyright (c) 2013 wenjiegit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
this software and associated documentation files (the "Software"), to deal in
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
| 
						 | 
					@ -1355,10 +1356,6 @@ int SrsCommonMessage::decode_packet(SrsProtocol* protocol)
 | 
				
			||||||
		srs_verbose("start to decode set chunk size message.");
 | 
							srs_verbose("start to decode set chunk size message.");
 | 
				
			||||||
		packet = new SrsSetChunkSizePacket();
 | 
							packet = new SrsSetChunkSizePacket();
 | 
				
			||||||
		return packet->decode(stream);
 | 
							return packet->decode(stream);
 | 
				
			||||||
    } else if(header.is_windows_ackledgement()) {
 | 
					 | 
				
			||||||
        srs_verbose("start to decode AcknowledgementPacket message.");
 | 
					 | 
				
			||||||
        packet = new SrsAcknowledgementPacket();
 | 
					 | 
				
			||||||
        return packet->decode(stream);
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
		// default packet to drop message.
 | 
							// default packet to drop message.
 | 
				
			||||||
		srs_trace("drop the unknown message, type=%d", header.message_type);
 | 
							srs_trace("drop the unknown message, type=%d", header.message_type);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
The MIT License (MIT)
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2013 winlin
 | 
					Copyright (c) 2013 winlin
 | 
				
			||||||
 | 
					Copyright (c) 2013 wenjiegit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
this software and associated documentation files (the "Software"), to deal in
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
| 
						 | 
					@ -66,6 +67,25 @@ class ISrsMessage;
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
#define RTMP_MAX_FMT3_HEADER_SIZE 5
 | 
					#define RTMP_MAX_FMT3_HEADER_SIZE 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* band width check method name, which will be invoked by client.
 | 
				
			||||||
 | 
					* band width check mothods use SrsOnStatusCallPacket as its internal packet type,
 | 
				
			||||||
 | 
					* so ensure you set command name when you use it.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					// for play
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_START_PLAY         "onSrsBandCheckStartPlayBytes"
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_STARTING_PLAY      "onSrsBandCheckStartingPlayBytes"
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_STOP_PLAY          "onSrsBandCheckStopPlayBytes"
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_STOPPED_PLAY       "onSrsBandCheckStoppedPlayBytes"
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_PLAYING            "onSrsBandCheckPlaying"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// for publish
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_START_PUBLISH      "onSrsBandCheckStartPublishBytes"
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_STARTING_PUBLISH   "onSrsBandCheckStartingPublishBytes"
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_STOP_PUBLISH       "onSrsBandCheckStopPublishBytes"
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_FINISHED           "onSrsBandCheckFinished"
 | 
				
			||||||
 | 
					#define SRS_BW_CHECK_PUBLISHING         "onSrsBandCheckPublishing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* the protocol provides the rtmp-message-protocol services,
 | 
					* the protocol provides the rtmp-message-protocol services,
 | 
				
			||||||
* to recv RTMP message from RTMP chunk stream,
 | 
					* to recv RTMP message from RTMP chunk stream,
 | 
				
			||||||
| 
						 | 
					@ -802,26 +822,6 @@ protected:
 | 
				
			||||||
	virtual int encode_packet(SrsStream* stream);
 | 
						virtual int encode_packet(SrsStream* stream);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
* band width check method name, which will be invoked by client.
 | 
					 | 
				
			||||||
* band width check mothods use SrsOnStatusCallPacket as its internal packet type,
 | 
					 | 
				
			||||||
* so ensure you set command name when you use it.
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
// for play
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_START_PLAY         "onSrsBandCheckStartPlayBytes"
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_STARTING_PLAY      "onSrsBandCheckStartingPlayBytes"
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_STOP_PLAY          "onSrsBandCheckStopPlayBytes"
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_STOPPED_PLAY       "onSrsBandCheckStoppedPlayBytes"
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_PLAYING            "onSrsBandCheckPlaying"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// for publish
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_START_PUBLISH      "onSrsBandCheckStartPublishBytes"
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_STARTING_PUBLISH   "onSrsBandCheckStartingPublishBytes"
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_STOP_PUBLISH       "onSrsBandCheckStopPublishBytes"
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_FINISHED           "onSrsBandCheckFinished"
 | 
					 | 
				
			||||||
#define SRS_BW_CHECK_PUBLISHING         "onSrsBandCheckPublishing"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* onStatus command, AMF0 Call
 | 
					* onStatus command, AMF0 Call
 | 
				
			||||||
* @remark, user must set the stream_id by SrsMessage.set_packet().
 | 
					* @remark, user must set the stream_id by SrsMessage.set_packet().
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1106,7 +1106,7 @@ int SrsRtmp::start_flash_publish(int stream_id)
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SrsRtmp::start_bandwidth_check(int max_play_kbps, int max_pub_kbps)
 | 
					int SrsRtmp::start_bandwidth_check(int limit_kbps)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret = ERROR_SUCCESS;
 | 
					    int ret = ERROR_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1121,11 +1121,11 @@ int SrsRtmp::start_bandwidth_check(int max_play_kbps, int max_pub_kbps)
 | 
				
			||||||
    int publish_bytes              = 0;
 | 
					    int publish_bytes              = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int64_t start_time = srs_get_system_time_ms();
 | 
					    int64_t start_time = srs_get_system_time_ms();
 | 
				
			||||||
    if((ret = bandwidth_check_play(play_duration_ms, play_interval_ms,
 | 
					    if ((ret = bandwidth_check_play(play_duration_ms, play_interval_ms,
 | 
				
			||||||
                                   play_actual_duration_ms, play_bytes, max_play_kbps) != ERROR_SUCCESS)
 | 
					                                   play_actual_duration_ms, play_bytes, limit_kbps) != ERROR_SUCCESS)
 | 
				
			||||||
            || (ret = bandwidth_check_publish(publish_duration_ms, publish_interval_ms,
 | 
					            || (ret = bandwidth_check_publish(publish_duration_ms, publish_interval_ms,
 | 
				
			||||||
                                   publish_actual_duration_ms, publish_bytes, max_pub_kbps)) != ERROR_SUCCESS)
 | 
					                                   publish_actual_duration_ms, publish_bytes, limit_kbps)) != ERROR_SUCCESS) {
 | 
				
			||||||
    {
 | 
					
 | 
				
			||||||
        srs_error("band width check failed. ret = %d", ret);
 | 
					        srs_error("band width check failed. ret = %d", ret);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
| 
						 | 
					@ -1272,8 +1272,7 @@ int SrsRtmp::bandwidth_check_play(int duration_ms, int interval_ms, int &actual_
 | 
				
			||||||
    // recv client's starting play response
 | 
					    // recv client's starting play response
 | 
				
			||||||
    while (true) {
 | 
					    while (true) {
 | 
				
			||||||
        SrsCommonMessage* msg = 0;
 | 
					        SrsCommonMessage* msg = 0;
 | 
				
			||||||
        if( (ret = protocol->recv_message(&msg)) != ERROR_SUCCESS)
 | 
					        if ( (ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) {
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            srs_error("recv client's starting play response failed. ret= %d", ret);
 | 
					            srs_error("recv client's starting play response failed. ret= %d", ret);
 | 
				
			||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -1286,21 +1285,19 @@ int SrsRtmp::bandwidth_check_play(int duration_ms, int interval_ms, int &actual_
 | 
				
			||||||
    srs_trace("BW check recv play begin response.");
 | 
					    srs_trace("BW check recv play begin response.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // send play data to client
 | 
					    // send play data to client
 | 
				
			||||||
    int64_t current_Time = srs_get_system_time_ms();
 | 
					    int64_t current_time = srs_get_system_time_ms();
 | 
				
			||||||
    int size = 1024*4;   // 32KB
 | 
					    int size = 1024;
 | 
				
			||||||
    char random_data[size];
 | 
					    char random_data[size];
 | 
				
			||||||
    memset(random_data, 0x01, size);
 | 
					    memset(random_data, 0x01, size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int64_t last_time = current_Time;
 | 
					 | 
				
			||||||
    int interval = 0;
 | 
					    int interval = 0;
 | 
				
			||||||
    while ( (srs_get_system_time_ms() - current_Time) < duration_ms ){
 | 
					    while ( (srs_get_system_time_ms() - current_time) < duration_ms ) {
 | 
				
			||||||
        st_usleep(interval);
 | 
					        st_usleep(interval);
 | 
				
			||||||
        SrsCommonMessage* msg = new SrsCommonMessage;
 | 
					        SrsCommonMessage* msg = new SrsCommonMessage;
 | 
				
			||||||
        SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket;
 | 
					        SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket;
 | 
				
			||||||
        pkt->command_name = SRS_BW_CHECK_PLAYING;
 | 
					        pkt->command_name = SRS_BW_CHECK_PLAYING;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for(int i = 0; i < 10; ++i)
 | 
					        for (int i = 0; i < 100; ++i) {
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            char buf[32];
 | 
					            char buf[32];
 | 
				
			||||||
            sprintf(buf, "%d", i);
 | 
					            sprintf(buf, "%d", i);
 | 
				
			||||||
            pkt->data->set(buf, new SrsAmf0String(random_data));
 | 
					            pkt->data->set(buf, new SrsAmf0String(random_data));
 | 
				
			||||||
| 
						 | 
					@ -1310,22 +1307,24 @@ int SrsRtmp::bandwidth_check_play(int duration_ms, int interval_ms, int &actual_
 | 
				
			||||||
        play_bytes += pkt->get_payload_length();
 | 
					        play_bytes += pkt->get_payload_length();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
 | 
					        if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) {
 | 
				
			||||||
           srs_error("send bandwidth check play messages failed. ret=%d", ret);
 | 
					            srs_error("send bandwidth check play messages failed. ret=%d", ret);
 | 
				
			||||||
           return ret;
 | 
					            return ret;
 | 
				
			||||||
       }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if((srs_get_system_time_ms() - last_time) > 5){ // check kbps every 5 ms;
 | 
					        // sleep while current kbps <= max_play_kbps
 | 
				
			||||||
            int kbps = play_bytes * 8 / (srs_get_system_time_ms() - current_Time);
 | 
					        int kbps = 0;
 | 
				
			||||||
            if(kbps > max_play_kbps){
 | 
					        while (true) {
 | 
				
			||||||
                interval += 1000*3;    // 2 ms
 | 
					            if(srs_get_system_time_ms() - current_time != 0)
 | 
				
			||||||
 | 
					                kbps = play_bytes * 8 / (srs_get_system_time_ms() - current_time);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (kbps > max_play_kbps) {
 | 
				
			||||||
 | 
					                st_usleep(500);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                interval -= 1000*3;
 | 
					                break;
 | 
				
			||||||
                if(interval < 0)
 | 
					 | 
				
			||||||
                    interval = 0;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    actual_duration_ms = srs_get_system_time_ms() - current_Time;
 | 
					    actual_duration_ms = srs_get_system_time_ms() - current_time;
 | 
				
			||||||
    srs_trace("BW check send play bytes over.");
 | 
					    srs_trace("BW check send play bytes over.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // notify client to stop play
 | 
					    // notify client to stop play
 | 
				
			||||||
| 
						 | 
					@ -1348,8 +1347,7 @@ int SrsRtmp::bandwidth_check_play(int duration_ms, int interval_ms, int &actual_
 | 
				
			||||||
    // recv client's stop play response.
 | 
					    // recv client's stop play response.
 | 
				
			||||||
    while (true) {
 | 
					    while (true) {
 | 
				
			||||||
        SrsCommonMessage* msg = 0;
 | 
					        SrsCommonMessage* msg = 0;
 | 
				
			||||||
        if((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS)
 | 
					        if ((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) {
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            srs_error("recv client's stop play response failed. ret = %d", ret);
 | 
					            srs_error("recv client's stop play response failed. ret = %d", ret);
 | 
				
			||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -1386,8 +1384,7 @@ int SrsRtmp::bandwidth_check_publish(int duration_ms, int interval_ms, int &actu
 | 
				
			||||||
    // read client's notification of starting publish
 | 
					    // read client's notification of starting publish
 | 
				
			||||||
    while (true) {
 | 
					    while (true) {
 | 
				
			||||||
        SrsCommonMessage* msg = 0;
 | 
					        SrsCommonMessage* msg = 0;
 | 
				
			||||||
        if((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS)
 | 
					        if ((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) {
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            srs_error("recv client's notification of starting publish failed. ret = %d", ret);
 | 
					            srs_error("recv client's notification of starting publish failed. ret = %d", ret);
 | 
				
			||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -1401,12 +1398,8 @@ int SrsRtmp::bandwidth_check_publish(int duration_ms, int interval_ms, int &actu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // recv publish msgs until @duration_ms ms
 | 
					    // recv publish msgs until @duration_ms ms
 | 
				
			||||||
    int64_t current_time = srs_get_system_time_ms();
 | 
					    int64_t current_time = srs_get_system_time_ms();
 | 
				
			||||||
    int64_t last_time = current_time;
 | 
					    while ( (srs_get_system_time_ms() - current_time) < duration_ms ) {
 | 
				
			||||||
    int interval = 0;
 | 
					        st_usleep(0);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    while( (srs_get_system_time_ms() - current_time) < duration_ms )
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        st_usleep(interval);
 | 
					 | 
				
			||||||
        SrsCommonMessage* msg = NULL;
 | 
					        SrsCommonMessage* msg = NULL;
 | 
				
			||||||
        if ((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) {
 | 
					        if ((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) {
 | 
				
			||||||
            srs_error("recv message failed. ret=%d", ret);
 | 
					            srs_error("recv message failed. ret=%d", ret);
 | 
				
			||||||
| 
						 | 
					@ -1416,14 +1409,15 @@ int SrsRtmp::bandwidth_check_publish(int duration_ms, int interval_ms, int &actu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        publish_bytes += msg->header.payload_length;
 | 
					        publish_bytes += msg->header.payload_length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if((srs_get_system_time_ms() - last_time) > 5){ // check kbps every 5 ms;
 | 
					        int kbps = 0;
 | 
				
			||||||
            int kbps = publish_bytes * 8 / (srs_get_system_time_ms() - current_time);
 | 
					        while (true) {
 | 
				
			||||||
            if(kbps > max_pub_kbps){
 | 
					            if(srs_get_system_time_ms() - current_time != 0)
 | 
				
			||||||
                interval += 1000*3;    // 2 ms
 | 
					                kbps = publish_bytes * 8 / (srs_get_system_time_ms() - current_time);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (kbps > max_pub_kbps) {
 | 
				
			||||||
 | 
					                st_usleep(500);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                interval -= 1000*3;
 | 
					                break;
 | 
				
			||||||
                if(interval < 0)
 | 
					 | 
				
			||||||
                    interval = 0;
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -1448,11 +1442,10 @@ int SrsRtmp::bandwidth_check_publish(int duration_ms, int interval_ms, int &actu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // recv left msg
 | 
					    // recv left msg
 | 
				
			||||||
    while (true) {
 | 
					    while (true) {
 | 
				
			||||||
        if((ret = st_netfd_poll(stfd, POLLIN, 1000*500)) == ERROR_SUCCESS)
 | 
					        if((ret = st_netfd_poll(stfd, POLLIN, 1000*500)) == ERROR_SUCCESS) {
 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            SrsCommonMessage* msg = 0;
 | 
					            SrsCommonMessage* msg = 0;
 | 
				
			||||||
            if((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS)
 | 
					
 | 
				
			||||||
            {
 | 
					            if ((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) {
 | 
				
			||||||
                srs_error("recv client's left msg failed, ret = %d", ret);
 | 
					                srs_error("recv client's left msg failed, ret = %d", ret);
 | 
				
			||||||
                return ret;
 | 
					                return ret;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -225,7 +225,7 @@ public:
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    * used to process band width check from client.
 | 
					    * used to process band width check from client.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
    virtual int start_bandwidth_check(int max_play_kbps, int max_pub_kbps);
 | 
					    virtual int start_bandwidth_check(int limit_kbps);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
	virtual int identify_create_stream_client(SrsCreateStreamPacket* req, int stream_id, SrsClientType& type, std::string& stream_name);
 | 
						virtual int identify_create_stream_client(SrsCreateStreamPacket* req, int stream_id, SrsClientType& type, std::string& stream_name);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue