AbstractStream::status PlaylistManager::demux(mtime_t nzdeadline, bool send) { AbstractStream::status i_return = AbstractStream::status_eof; std::vector<AbstractStream *>::iterator it; for(it=streams.begin(); it!=streams.end(); ++it) { AbstractStream *st = *it; if (st->isDisabled()) { if(st->isSelected() && !st->isEOF()) reactivateStream(st); else continue; } AbstractStream::status i_ret = st->demux(nzdeadline, send); if(i_ret == AbstractStream::status_buffering_ahead || i_return == AbstractStream::status_buffering_ahead) { i_return = AbstractStream::status_buffering_ahead; } else if(i_ret == AbstractStream::status_buffering) { i_return = AbstractStream::status_buffering; } else if(i_ret == AbstractStream::status_demuxed && i_return != AbstractStream::status_buffering) { i_return = AbstractStream::status_demuxed; } else if(i_ret == AbstractStream::status_dis) { i_return = AbstractStream::status_dis; } } /* might be end of current period */ if(i_return == AbstractStream::status_eof && currentPeriod) { unsetPeriod(); currentPeriod = playlist->getNextPeriod(currentPeriod); i_return = (setupPeriod()) ? AbstractStream::status_eop : AbstractStream::status_eof; } return i_return; }
AbstractStream::buffering_status PlaylistManager::bufferize(mtime_t i_nzdeadline, unsigned i_min_buffering, unsigned i_extra_buffering) { AbstractStream::buffering_status i_return = AbstractStream::buffering_end; /* First reorder by status >> buffering level */ std::vector<AbstractStream *> prioritized_streams(streams); std::sort(prioritized_streams.begin(), prioritized_streams.end(), streamCompare); std::vector<AbstractStream *>::iterator it; for(it=prioritized_streams.begin(); it!=prioritized_streams.end(); ++it) { AbstractStream *st = *it; if (st->isDisabled() && (!st->isSelected() || !st->canActivate() || !reactivateStream(st))) continue; AbstractStream::buffering_status i_ret = st->bufferize(i_nzdeadline, i_min_buffering, i_extra_buffering); if(i_return != AbstractStream::buffering_ongoing) /* Buffering streams need to keep going */ { if(i_ret > i_return) i_return = i_ret; } /* Bail out, will start again (high prio could be same starving stream) */ if( i_return == AbstractStream::buffering_lessthanmin ) break; } vlc_mutex_lock(&demux.lock); if(demux.i_nzpcr == VLC_TS_INVALID && i_return != AbstractStream::buffering_lessthanmin /* prevents starting before buffering is reached */ ) { demux.i_nzpcr = getFirstDTS(); } vlc_mutex_unlock(&demux.lock); return i_return; }
AbstractStream::buffering_status PlaylistManager::bufferize(mtime_t i_nzdeadline, unsigned i_min_buffering, unsigned i_extra_buffering) { AbstractStream::buffering_status i_return = AbstractStream::buffering_end; std::vector<AbstractStream *>::iterator it; for(it=streams.begin(); it!=streams.end(); ++it) { AbstractStream *st = *it; if (st->isDisabled()) { if(st->isSelected() && !st->isDead()) reactivateStream(st); else continue; } AbstractStream::buffering_status i_ret = st->bufferize(i_nzdeadline, i_min_buffering, i_extra_buffering); if(i_return != AbstractStream::buffering_ongoing) /* Buffering streams need to keep going */ { if(i_ret > i_return) i_return = i_ret; } } vlc_mutex_lock(&demux.lock); if(demux.i_nzpcr == VLC_TS_INVALID && i_return != AbstractStream::buffering_lessthanmin /* prevents starting before buffering is reached */ ) { demux.i_nzpcr = getFirstDTS(); } vlc_mutex_unlock(&demux.lock); return i_return; }