mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	fix #383, support mix_correct algorithm. 2.0.161.
This commit is contained in:
		
							parent
							
								
									8fbc6526bb
								
							
						
					
					
						commit
						22ca46350b
					
				
					 9 changed files with 189 additions and 17 deletions
				
			
		| 
						 | 
					@ -562,6 +562,7 @@ Supported operating systems and hardware:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### SRS 2.0 history
 | 
					### SRS 2.0 history
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* v2.0, 2015-04-15, for [#383](https://github.com/winlinvip/simple-rtmp-server/issues/383), support mix_correct algorithm. 2.0.161.
 | 
				
			||||||
* v2.0, 2015-04-13, for [#381](https://github.com/winlinvip/simple-rtmp-server/issues/381), support reap hls/ts by gop or not. 2.0.160.
 | 
					* v2.0, 2015-04-13, for [#381](https://github.com/winlinvip/simple-rtmp-server/issues/381), support reap hls/ts by gop or not. 2.0.160.
 | 
				
			||||||
* v2.0, 2015-04-10, enhanced on_hls_notify, support HTTP GET when reap ts.
 | 
					* v2.0, 2015-04-10, enhanced on_hls_notify, support HTTP GET when reap ts.
 | 
				
			||||||
* v2.0, 2015-04-10, refine the hls deviation for floor algorithm.
 | 
					* v2.0, 2015-04-10, refine the hls deviation for floor algorithm.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1329,7 +1329,7 @@ vhost jitter.srs.com {
 | 
				
			||||||
    # about the stream monotonically increasing:
 | 
					    # about the stream monotonically increasing:
 | 
				
			||||||
    #   1. video timestamp is monotonically increasing, 
 | 
					    #   1. video timestamp is monotonically increasing, 
 | 
				
			||||||
    #   2. audio timestamp is monotonically increasing,
 | 
					    #   2. audio timestamp is monotonically increasing,
 | 
				
			||||||
    #   3. video and audio timestamp is interleaved monotonically increasing.
 | 
					    #   3. video and audio timestamp is interleaved/mixed monotonically increasing.
 | 
				
			||||||
    # it's specified by RTMP specification, @see 3. Byte Order, Alignment, and Time Format
 | 
					    # it's specified by RTMP specification, @see 3. Byte Order, Alignment, and Time Format
 | 
				
			||||||
    # however, some encoder cannot provides this feature, please set this to off to ignore time jitter.
 | 
					    # however, some encoder cannot provides this feature, please set this to off to ignore time jitter.
 | 
				
			||||||
    # the time jitter algorithm:
 | 
					    # the time jitter algorithm:
 | 
				
			||||||
| 
						 | 
					@ -1338,8 +1338,8 @@ vhost jitter.srs.com {
 | 
				
			||||||
    #   3. off, disable the time jitter algorithm, like atc.
 | 
					    #   3. off, disable the time jitter algorithm, like atc.
 | 
				
			||||||
    # default: full
 | 
					    # default: full
 | 
				
			||||||
    time_jitter             full;
 | 
					    time_jitter             full;
 | 
				
			||||||
    # whether use the mix algorithm to correct the timestamp.
 | 
					    # whether use the interleaved/mixed algorithm to correct the timestamp.
 | 
				
			||||||
    # if on, always ensure the timestamp of audio+video is monotonically increase.
 | 
					    # if on, always ensure the timestamp of audio+video is interleaved/mixed monotonically increase.
 | 
				
			||||||
    # if off, use time_jitter to correct the timestamp if required.
 | 
					    # if off, use time_jitter to correct the timestamp if required.
 | 
				
			||||||
    # default: off
 | 
					    # default: off
 | 
				
			||||||
    mix_correct             off;
 | 
					    mix_correct             off;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -807,6 +807,17 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                srs_trace("vhost %s reload time_jitter success.", vhost.c_str());
 | 
					                srs_trace("vhost %s reload time_jitter success.", vhost.c_str());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            // mix_correct, only one per vhost
 | 
				
			||||||
 | 
					            if (!srs_directive_equals(new_vhost->get("mix_correct"), old_vhost->get("mix_correct"))) {
 | 
				
			||||||
 | 
					                for (it = subscribes.begin(); it != subscribes.end(); ++it) {
 | 
				
			||||||
 | 
					                    ISrsReloadHandler* subscribe = *it;
 | 
				
			||||||
 | 
					                    if ((ret = subscribe->on_reload_vhost_mix_correct(vhost)) != ERROR_SUCCESS) {
 | 
				
			||||||
 | 
					                        srs_error("vhost %s notify subscribes mix_correct failed. ret=%d", vhost.c_str(), ret);
 | 
				
			||||||
 | 
					                        return ret;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                srs_trace("vhost %s reload mix_correct success.", vhost.c_str());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            // forward, only one per vhost
 | 
					            // forward, only one per vhost
 | 
				
			||||||
            if (!srs_directive_equals(new_vhost->get("forward"), old_vhost->get("forward"))) {
 | 
					            if (!srs_directive_equals(new_vhost->get("forward"), old_vhost->get("forward"))) {
 | 
				
			||||||
                for (it = subscribes.begin(); it != subscribes.end(); ++it) {
 | 
					                for (it = subscribes.begin(); it != subscribes.end(); ++it) {
 | 
				
			||||||
| 
						 | 
					@ -1419,7 +1430,7 @@ int SrsConfig::check_config()
 | 
				
			||||||
                && n != "gop_cache" && n != "queue_length"
 | 
					                && n != "gop_cache" && n != "queue_length"
 | 
				
			||||||
                && n != "refer" && n != "refer_publish" && n != "refer_play"
 | 
					                && n != "refer" && n != "refer_publish" && n != "refer_play"
 | 
				
			||||||
                && n != "forward" && n != "transcode" && n != "bandcheck"
 | 
					                && n != "forward" && n != "transcode" && n != "bandcheck"
 | 
				
			||||||
                && n != "time_jitter" 
 | 
					                && n != "time_jitter" && n != "mix_correct"
 | 
				
			||||||
                && n != "atc" && n != "atc_auto"
 | 
					                && n != "atc" && n != "atc_auto"
 | 
				
			||||||
                && n != "debug_srs_upnode"
 | 
					                && n != "debug_srs_upnode"
 | 
				
			||||||
                && n != "mr" && n != "mw_latency" && n != "min_latency"
 | 
					                && n != "mr" && n != "mw_latency" && n != "min_latency"
 | 
				
			||||||
| 
						 | 
					@ -2118,12 +2129,12 @@ bool SrsConfig::get_atc_auto(string vhost)
 | 
				
			||||||
    SrsConfDirective* conf = get_vhost(vhost);
 | 
					    SrsConfDirective* conf = get_vhost(vhost);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!conf) {
 | 
					    if (!conf) {
 | 
				
			||||||
        return true;
 | 
					        return SRS_CONF_DEFAULT_ATC_AUTO;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    conf = conf->get("atc_auto");
 | 
					    conf = conf->get("atc_auto");
 | 
				
			||||||
    if (!conf || conf->arg0().empty()) {
 | 
					    if (!conf || conf->arg0().empty()) {
 | 
				
			||||||
        return true;
 | 
					        return SRS_CONF_DEFAULT_ATC_AUTO;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return SRS_CONF_PERFER_TRUE(conf->arg0());
 | 
					    return SRS_CONF_PERFER_TRUE(conf->arg0());
 | 
				
			||||||
| 
						 | 
					@ -2131,14 +2142,14 @@ bool SrsConfig::get_atc_auto(string vhost)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SrsConfig::get_time_jitter(string vhost)
 | 
					int SrsConfig::get_time_jitter(string vhost)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SrsConfDirective* dvr = get_vhost(vhost);
 | 
					    SrsConfDirective* conf = get_vhost(vhost);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    std::string time_jitter = SRS_CONF_DEFAULT_TIME_JITTER;
 | 
					    std::string time_jitter = SRS_CONF_DEFAULT_TIME_JITTER;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (dvr) {
 | 
					    if (conf) {
 | 
				
			||||||
        SrsConfDirective* conf = dvr->get("time_jitter");
 | 
					        conf = conf->get("time_jitter");
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
        if (conf) {
 | 
					        if (conf && !conf->arg0().empty()) {
 | 
				
			||||||
            time_jitter = conf->arg0();
 | 
					            time_jitter = conf->arg0();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -2146,6 +2157,22 @@ int SrsConfig::get_time_jitter(string vhost)
 | 
				
			||||||
    return _srs_time_jitter_string2int(time_jitter);
 | 
					    return _srs_time_jitter_string2int(time_jitter);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool SrsConfig::get_mix_correct(string vhost)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SrsConfDirective* conf = get_vhost(vhost);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (!conf) {
 | 
				
			||||||
 | 
					        return SRS_CONF_DEFAULT_MIX_CORRECT;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    conf = conf->get("mix_correct");
 | 
				
			||||||
 | 
					    if (!conf || conf->arg0().empty()) {
 | 
				
			||||||
 | 
					        return SRS_CONF_DEFAULT_MIX_CORRECT;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return SRS_CONF_PERFER_FALSE(conf->arg0());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
double SrsConfig::get_queue_length(string vhost)
 | 
					double SrsConfig::get_queue_length(string vhost)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SrsConfDirective* conf = get_vhost(vhost);
 | 
					    SrsConfDirective* conf = get_vhost(vhost);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,6 +72,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
#define SRS_CONF_DEFAULT_DVR_PLAN SRS_CONF_DEFAULT_DVR_PLAN_SESSION
 | 
					#define SRS_CONF_DEFAULT_DVR_PLAN SRS_CONF_DEFAULT_DVR_PLAN_SESSION
 | 
				
			||||||
#define SRS_CONF_DEFAULT_DVR_DURATION 30
 | 
					#define SRS_CONF_DEFAULT_DVR_DURATION 30
 | 
				
			||||||
#define SRS_CONF_DEFAULT_TIME_JITTER "full"
 | 
					#define SRS_CONF_DEFAULT_TIME_JITTER "full"
 | 
				
			||||||
 | 
					#define SRS_CONF_DEFAULT_ATC_AUTO true
 | 
				
			||||||
 | 
					#define SRS_CONF_DEFAULT_MIX_CORRECT false
 | 
				
			||||||
// in seconds, the paused queue length.
 | 
					// in seconds, the paused queue length.
 | 
				
			||||||
#define SRS_CONF_DEFAULT_PAUSED_LENGTH 10
 | 
					#define SRS_CONF_DEFAULT_PAUSED_LENGTH 10
 | 
				
			||||||
// the interval in seconds for bandwidth check
 | 
					// the interval in seconds for bandwidth check
 | 
				
			||||||
| 
						 | 
					@ -531,6 +533,11 @@ public:
 | 
				
			||||||
    * @remark, default full.
 | 
					    * @remark, default full.
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
    virtual int                 get_time_jitter(std::string vhost);
 | 
					    virtual int                 get_time_jitter(std::string vhost);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * whether use mix correct algorithm to ensure the timestamp
 | 
				
			||||||
 | 
					     * monotonically increase.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    virtual bool                get_mix_correct(std::string vhost);
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    * get the cache queue length, in seconds.
 | 
					    * get the cache queue length, in seconds.
 | 
				
			||||||
    * when exceed the queue length, drop packet util I frame.
 | 
					    * when exceed the queue length, drop packet util I frame.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,6 +130,11 @@ int ISrsReloadHandler::on_reload_vhost_time_jitter(string /*vhost*/)
 | 
				
			||||||
    return ERROR_SUCCESS;
 | 
					    return ERROR_SUCCESS;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ISrsReloadHandler::on_reload_vhost_mix_correct(string /*vhost*/)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return ERROR_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ISrsReloadHandler::on_reload_vhost_forward(string /*vhost*/)
 | 
					int ISrsReloadHandler::on_reload_vhost_forward(string /*vhost*/)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return ERROR_SUCCESS;
 | 
					    return ERROR_SUCCESS;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,6 +63,7 @@ public:
 | 
				
			||||||
    virtual int on_reload_vhost_gop_cache(std::string vhost);
 | 
					    virtual int on_reload_vhost_gop_cache(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_queue_length(std::string vhost);
 | 
					    virtual int on_reload_vhost_queue_length(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_time_jitter(std::string vhost);
 | 
					    virtual int on_reload_vhost_time_jitter(std::string vhost);
 | 
				
			||||||
 | 
					    virtual int on_reload_vhost_mix_correct(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_forward(std::string vhost);
 | 
					    virtual int on_reload_vhost_forward(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_hls(std::string vhost);
 | 
					    virtual int on_reload_vhost_hls(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_hds(std::string vhost);
 | 
					    virtual int on_reload_vhost_hds(std::string vhost);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,7 @@ using namespace std;
 | 
				
			||||||
#include <srs_rtmp_msg_array.hpp>
 | 
					#include <srs_rtmp_msg_array.hpp>
 | 
				
			||||||
#include <srs_app_hds.hpp>
 | 
					#include <srs_app_hds.hpp>
 | 
				
			||||||
#include <srs_app_statistic.hpp>
 | 
					#include <srs_app_statistic.hpp>
 | 
				
			||||||
 | 
					#include <srs_core_autofree.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CONST_MAX_JITTER_MS         500
 | 
					#define CONST_MAX_JITTER_MS         500
 | 
				
			||||||
#define DEFAULT_FRAME_TIME_MS         40
 | 
					#define DEFAULT_FRAME_TIME_MS         40
 | 
				
			||||||
| 
						 | 
					@ -768,10 +769,62 @@ void SrsSource::destroy()
 | 
				
			||||||
    pool.clear();
 | 
					    pool.clear();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SrsMixQueue::SrsMixQueue()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    nb_videos = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SrsMixQueue::~SrsMixQueue()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    clear();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SrsMixQueue::clear()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    std::multimap<int64_t, SrsSharedPtrMessage*>::iterator it;
 | 
				
			||||||
 | 
					    for (it = msgs.begin(); it != msgs.end(); ++it) {
 | 
				
			||||||
 | 
					        SrsSharedPtrMessage* msg = it->second;
 | 
				
			||||||
 | 
					        srs_freep(msg);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    msgs.clear();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    nb_videos = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SrsMixQueue::push(SrsSharedPtrMessage* msg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    msgs.insert(std::make_pair(msg->timestamp, msg));
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (msg->is_video()) {
 | 
				
			||||||
 | 
					        nb_videos++;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SrsSharedPtrMessage* SrsMixQueue::pop()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // always keep 2+ videos
 | 
				
			||||||
 | 
					    if (nb_videos < 2) {
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // pop the first msg.
 | 
				
			||||||
 | 
					    std::multimap<int64_t, SrsSharedPtrMessage*>::iterator it = msgs.begin();
 | 
				
			||||||
 | 
					    SrsSharedPtrMessage* msg = it->second;
 | 
				
			||||||
 | 
					    msgs.erase(it);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (msg->is_video()) {
 | 
				
			||||||
 | 
					        nb_videos--;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return msg;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SrsSource::SrsSource()
 | 
					SrsSource::SrsSource()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    _req = NULL;
 | 
					    _req = NULL;
 | 
				
			||||||
    jitter_algorithm = SrsRtmpJitterAlgorithmOFF;
 | 
					    jitter_algorithm = SrsRtmpJitterAlgorithmOFF;
 | 
				
			||||||
 | 
					    mix_correct = false;
 | 
				
			||||||
 | 
					    mix_queue = new SrsMixQueue();
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
#ifdef SRS_AUTO_HLS
 | 
					#ifdef SRS_AUTO_HLS
 | 
				
			||||||
    hls = new SrsHls();
 | 
					    hls = new SrsHls();
 | 
				
			||||||
| 
						 | 
					@ -818,6 +871,7 @@ SrsSource::~SrsSource()
 | 
				
			||||||
        forwarders.clear();
 | 
					        forwarders.clear();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    srs_freep(mix_queue);
 | 
				
			||||||
    srs_freep(cache_metadata);
 | 
					    srs_freep(cache_metadata);
 | 
				
			||||||
    srs_freep(cache_sh_video);
 | 
					    srs_freep(cache_sh_video);
 | 
				
			||||||
    srs_freep(cache_sh_audio);
 | 
					    srs_freep(cache_sh_audio);
 | 
				
			||||||
| 
						 | 
					@ -878,6 +932,7 @@ int SrsSource::initialize(SrsRequest* r, ISrsSourceHandler* h, ISrsHlsHandler* h
 | 
				
			||||||
    publish_edge->set_queue_size(queue_size);
 | 
					    publish_edge->set_queue_size(queue_size);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    jitter_algorithm = (SrsRtmpJitterAlgorithm)_srs_config->get_time_jitter(_req->vhost);
 | 
					    jitter_algorithm = (SrsRtmpJitterAlgorithm)_srs_config->get_time_jitter(_req->vhost);
 | 
				
			||||||
 | 
					    mix_correct = _srs_config->get_mix_correct(_req->vhost);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -973,6 +1028,25 @@ int SrsSource::on_reload_vhost_time_jitter(string vhost)
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int SrsSource::on_reload_vhost_mix_correct(string vhost)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int ret = ERROR_SUCCESS;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (_req->vhost != vhost) {
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    bool v = _srs_config->get_mix_correct(_req->vhost);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // when changed, clear the mix queue.
 | 
				
			||||||
 | 
					    if (v != mix_correct) {
 | 
				
			||||||
 | 
					        mix_queue->clear();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    mix_correct = v;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SrsSource::on_reload_vhost_forward(string vhost)
 | 
					int SrsSource::on_reload_vhost_forward(string vhost)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret = ERROR_SUCCESS;
 | 
					    int ret = ERROR_SUCCESS;
 | 
				
			||||||
| 
						 | 
					@ -1330,17 +1404,21 @@ int SrsSource::on_audio(SrsCommonMessage* shared_audio)
 | 
				
			||||||
        srs_error("initialize the audio failed. ret=%d", ret);
 | 
					        srs_error("initialize the audio failed. ret=%d", ret);
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    srs_verbose("initialize shared ptr audio success.");
 | 
					    srs_info("Audio dts=%"PRId64", size=%d", msg.timestamp, msg.size);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    srs_warn("Audio dts=%"PRId64", size=%d", msg.timestamp, msg.size);
 | 
					    if (!mix_correct) {
 | 
				
			||||||
 | 
					        return on_audio_imp(&msg);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return on_audio_imp(&msg);
 | 
					    return do_mix_correct(&msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SrsSource::on_audio_imp(SrsSharedPtrMessage* msg)
 | 
					int SrsSource::on_audio_imp(SrsSharedPtrMessage* msg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret = ERROR_SUCCESS;
 | 
					    int ret = ERROR_SUCCESS;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    srs_info("Audio dts=%"PRId64", size=%d", msg->timestamp, msg->size);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
#ifdef SRS_AUTO_HLS
 | 
					#ifdef SRS_AUTO_HLS
 | 
				
			||||||
    if ((ret = hls->on_audio(msg)) != ERROR_SUCCESS) {
 | 
					    if ((ret = hls->on_audio(msg)) != ERROR_SUCCESS) {
 | 
				
			||||||
        // apply the error strategy for hls.
 | 
					        // apply the error strategy for hls.
 | 
				
			||||||
| 
						 | 
					@ -1490,17 +1568,21 @@ int SrsSource::on_video(SrsCommonMessage* shared_video)
 | 
				
			||||||
        srs_error("initialize the video failed. ret=%d", ret);
 | 
					        srs_error("initialize the video failed. ret=%d", ret);
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    srs_verbose("initialize shared ptr video success.");
 | 
					    srs_info("Video dts=%"PRId64", size=%d", msg.timestamp, msg.size);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    srs_warn("Video dts=%"PRId64", size=%d", msg.timestamp, msg.size);
 | 
					    if (!mix_correct) {
 | 
				
			||||||
 | 
					        return on_video_imp(&msg);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    return on_video_imp(&msg);
 | 
					    return do_mix_correct(&msg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SrsSource::on_video_imp(SrsSharedPtrMessage* msg)
 | 
					int SrsSource::on_video_imp(SrsSharedPtrMessage* msg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret = ERROR_SUCCESS;
 | 
					    int ret = ERROR_SUCCESS;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    srs_info("Video dts=%"PRId64", size=%d", msg->timestamp, msg->size);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
#ifdef SRS_AUTO_HLS
 | 
					#ifdef SRS_AUTO_HLS
 | 
				
			||||||
    if ((ret = hls->on_video(msg)) != ERROR_SUCCESS) {
 | 
					    if ((ret = hls->on_video(msg)) != ERROR_SUCCESS) {
 | 
				
			||||||
        // apply the error strategy for hls.
 | 
					        // apply the error strategy for hls.
 | 
				
			||||||
| 
						 | 
					@ -1626,6 +1708,29 @@ int SrsSource::on_video_imp(SrsSharedPtrMessage* msg)
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int SrsSource::do_mix_correct(SrsSharedPtrMessage* msg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int ret = ERROR_SUCCESS;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // insert msg to the queue.
 | 
				
			||||||
 | 
					    mix_queue->push(msg->copy());
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // fetch someone from mix queue.
 | 
				
			||||||
 | 
					    SrsSharedPtrMessage* m = mix_queue->pop();
 | 
				
			||||||
 | 
					    if (!m) {
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    SrsAutoFree(SrsSharedPtrMessage, m);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // consume the monotonically increase message.
 | 
				
			||||||
 | 
					    if (m->is_audio()) {
 | 
				
			||||||
 | 
					        return on_audio_imp(m);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    srs_assert(m->is_video());
 | 
				
			||||||
 | 
					    return on_video_imp(m);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SrsSource::on_aggregate(SrsCommonMessage* msg)
 | 
					int SrsSource::on_aggregate(SrsCommonMessage* msg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret = ERROR_SUCCESS;
 | 
					    int ret = ERROR_SUCCESS;
 | 
				
			||||||
| 
						 | 
					@ -1766,6 +1871,9 @@ int SrsSource::on_publish()
 | 
				
			||||||
    // save its id to srouce id.
 | 
					    // save its id to srouce id.
 | 
				
			||||||
    on_source_id_changed(_srs_context->get_id());
 | 
					    on_source_id_changed(_srs_context->get_id());
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    // reset the mix queue.
 | 
				
			||||||
 | 
					    mix_queue->clear();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    // create forwarders
 | 
					    // create forwarders
 | 
				
			||||||
    if ((ret = create_forwarders()) != ERROR_SUCCESS) {
 | 
					    if ((ret = create_forwarders()) != ERROR_SUCCESS) {
 | 
				
			||||||
        srs_error("create forwarders failed. ret=%d", ret);
 | 
					        srs_error("create forwarders failed. ret=%d", ret);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -368,6 +368,23 @@ public:
 | 
				
			||||||
    virtual void on_unpublish(SrsSource* s, SrsRequest* r) = 0;
 | 
					    virtual void on_unpublish(SrsSource* s, SrsRequest* r) = 0;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * the mix queue to correct the timestamp for mix_correct algorithm.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					class SrsMixQueue
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    u_int32_t nb_videos;
 | 
				
			||||||
 | 
					    std::multimap<int64_t, SrsSharedPtrMessage*> msgs;
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    SrsMixQueue();
 | 
				
			||||||
 | 
					    virtual ~SrsMixQueue();
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    virtual void clear();
 | 
				
			||||||
 | 
					    virtual void push(SrsSharedPtrMessage* msg);
 | 
				
			||||||
 | 
					    virtual SrsSharedPtrMessage* pop();
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* live streaming source.
 | 
					* live streaming source.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
| 
						 | 
					@ -407,6 +424,9 @@ private:
 | 
				
			||||||
    std::vector<SrsConsumer*> consumers;
 | 
					    std::vector<SrsConsumer*> consumers;
 | 
				
			||||||
    // the time jitter algorithm for vhost.
 | 
					    // the time jitter algorithm for vhost.
 | 
				
			||||||
    SrsRtmpJitterAlgorithm jitter_algorithm;
 | 
					    SrsRtmpJitterAlgorithm jitter_algorithm;
 | 
				
			||||||
 | 
					    // whether use interlaced/mixed algorithm to correct timestamp.
 | 
				
			||||||
 | 
					    bool mix_correct;
 | 
				
			||||||
 | 
					    SrsMixQueue* mix_queue;
 | 
				
			||||||
    // hls handler.
 | 
					    // hls handler.
 | 
				
			||||||
#ifdef SRS_AUTO_HLS
 | 
					#ifdef SRS_AUTO_HLS
 | 
				
			||||||
    SrsHls* hls;
 | 
					    SrsHls* hls;
 | 
				
			||||||
| 
						 | 
					@ -474,6 +494,7 @@ public:
 | 
				
			||||||
    virtual int on_reload_vhost_gop_cache(std::string vhost);
 | 
					    virtual int on_reload_vhost_gop_cache(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_queue_length(std::string vhost);
 | 
					    virtual int on_reload_vhost_queue_length(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_time_jitter(std::string vhost);
 | 
					    virtual int on_reload_vhost_time_jitter(std::string vhost);
 | 
				
			||||||
 | 
					    virtual int on_reload_vhost_mix_correct(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_forward(std::string vhost);
 | 
					    virtual int on_reload_vhost_forward(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_hls(std::string vhost);
 | 
					    virtual int on_reload_vhost_hls(std::string vhost);
 | 
				
			||||||
    virtual int on_reload_vhost_hds(std::string vhost);
 | 
					    virtual int on_reload_vhost_hds(std::string vhost);
 | 
				
			||||||
| 
						 | 
					@ -503,6 +524,8 @@ public:
 | 
				
			||||||
    virtual int on_video(SrsCommonMessage* video);
 | 
					    virtual int on_video(SrsCommonMessage* video);
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    virtual int on_video_imp(SrsSharedPtrMessage* video);
 | 
					    virtual int on_video_imp(SrsSharedPtrMessage* video);
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    virtual int do_mix_correct(SrsSharedPtrMessage* msg);
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    virtual int on_aggregate(SrsCommonMessage* msg);
 | 
					    virtual int on_aggregate(SrsCommonMessage* msg);
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
// current release version
 | 
					// current release version
 | 
				
			||||||
#define VERSION_MAJOR       2
 | 
					#define VERSION_MAJOR       2
 | 
				
			||||||
#define VERSION_MINOR       0
 | 
					#define VERSION_MINOR       0
 | 
				
			||||||
#define VERSION_REVISION    160
 | 
					#define VERSION_REVISION    161
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// server info.
 | 
					// server info.
 | 
				
			||||||
#define RTMP_SIG_SRS_KEY "SRS"
 | 
					#define RTMP_SIG_SRS_KEY "SRS"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue