예제 #1
0
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;
}