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; }
bool PlaylistManager::setPosition(mtime_t time) { bool ret = true; for(int real = 0; real < 2; real++) { /* Always probe if we can seek first */ std::vector<AbstractStream *>::iterator it; for(it=streams.begin(); it!=streams.end(); ++it) { AbstractStream *st = *it; if(!st->isDisabled()) ret &= st->setPosition(time, !real); } if(!ret) break; } return ret; }
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; }
void PlaylistManager::drain() { for(;;) { bool b_drained = true; std::vector<AbstractStream *>::iterator it; for(it=streams.begin(); it!=streams.end(); ++it) { AbstractStream *st = *it; if (st->isDisabled()) continue; b_drained &= st->drain(); } if(b_drained) break; msleep(20*1000); /* ugly, but we have no way to get feedback */ } es_out_Control(p_demux->out, ES_OUT_RESET_PCR); }
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; }