Commit 21edb9b4 authored by Francois Cartegnie's avatar Francois Cartegnie

demux: adaptative: add queue between stream_demux and real es_out_send

parent 65940085
...@@ -216,6 +216,7 @@ size_t Stream::read(HTTPConnectionManager *connManager) ...@@ -216,6 +216,7 @@ size_t Stream::read(HTTPConnectionManager *connManager)
readsize = block->i_buffer; readsize = block->i_buffer;
output->pushBlock(block); output->pushBlock(block);
output->sendToDecoder(INT64_MAX - VLC_TS_0);
return readsize; return readsize;
} }
...@@ -239,7 +240,6 @@ AbstractStreamOutput::AbstractStreamOutput(demux_t *demux) ...@@ -239,7 +240,6 @@ AbstractStreamOutput::AbstractStreamOutput(demux_t *demux)
demuxstream = NULL; demuxstream = NULL;
pcr = VLC_TS_0; pcr = VLC_TS_0;
group = -1; group = -1;
escount = 0;
seekable = true; seekable = true;
fakeesout = new es_out_t; fakeesout = new es_out_t;
...@@ -273,7 +273,7 @@ int AbstractStreamOutput::getGroup() const ...@@ -273,7 +273,7 @@ int AbstractStreamOutput::getGroup() const
int AbstractStreamOutput::esCount() const int AbstractStreamOutput::esCount() const
{ {
return escount; return queues.size();
} }
void AbstractStreamOutput::pushBlock(block_t *block) void AbstractStreamOutput::pushBlock(block_t *block)
...@@ -288,28 +288,110 @@ bool AbstractStreamOutput::seekAble() const ...@@ -288,28 +288,110 @@ bool AbstractStreamOutput::seekAble() const
void AbstractStreamOutput::setPosition(mtime_t nztime) void AbstractStreamOutput::setPosition(mtime_t nztime)
{ {
std::list<Demuxed *>::const_iterator it;
for(it=queues.begin(); it!=queues.end();++it)
{
Demuxed *pair = *it;
if(pair->p_queue && pair->p_queue->i_dts > VLC_TS_0 + nztime)
pair->drop();
}
pcr = VLC_TS_0;
es_out_Control(realdemux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, es_out_Control(realdemux->out, ES_OUT_SET_NEXT_DISPLAY_TIME,
VLC_TS_0 + nztime); VLC_TS_0 + nztime);
} }
void AbstractStreamOutput::sendToDecoder(mtime_t nzdeadline)
{
std::list<Demuxed *>::const_iterator it;
for(it=queues.begin(); it!=queues.end();++it)
{
Demuxed *pair = *it;
while(pair->p_queue && pair->p_queue->i_dts <= VLC_TS_0 + nzdeadline)
{
block_t *p_block = pair->p_queue;
pair->p_queue = pair->p_queue->p_next;
p_block->p_next = NULL;
if(pair->pp_queue_last == &p_block->p_next)
pair->pp_queue_last = &pair->p_queue;
realdemux->out->pf_send(realdemux->out, pair->es_id, p_block);
}
}
}
void AbstractStreamOutput::dropQueues()
{
std::list<Demuxed *>::const_iterator it;
for(it=queues.begin(); it!=queues.end();++it)
(*it)->drop();
}
AbstractStreamOutput::Demuxed::Demuxed()
{
p_queue = NULL;
pp_queue_last = &p_queue;
es_id = NULL;
}
AbstractStreamOutput::Demuxed::~Demuxed()
{
drop();
}
void AbstractStreamOutput::Demuxed::drop()
{
block_ChainRelease(p_queue);
p_queue = NULL;
pp_queue_last = &p_queue;
}
/* Static callbacks */ /* Static callbacks */
es_out_id_t * AbstractStreamOutput::esOutAdd(es_out_t *fakees, const es_format_t *p_fmt) es_out_id_t * AbstractStreamOutput::esOutAdd(es_out_t *fakees, const es_format_t *p_fmt)
{ {
AbstractStreamOutput *me = (AbstractStreamOutput *) fakees->p_sys; AbstractStreamOutput *me = (AbstractStreamOutput *) fakees->p_sys;
me->escount++; es_out_id_t *p_es = me->realdemux->out->pf_add(me->realdemux->out, p_fmt);
return me->realdemux->out->pf_add(me->realdemux->out, p_fmt); if(p_es)
{
Demuxed *pair = new (std::nothrow) Demuxed();
if(pair)
{
pair->es_id = p_es;
me->queues.push_back(pair);
}
}
return p_es;
} }
int AbstractStreamOutput::esOutSend(es_out_t *fakees, es_out_id_t *p_es, block_t *p_block) int AbstractStreamOutput::esOutSend(es_out_t *fakees, es_out_id_t *p_es, block_t *p_block)
{ {
AbstractStreamOutput *me = (AbstractStreamOutput *) fakees->p_sys; AbstractStreamOutput *me = (AbstractStreamOutput *) fakees->p_sys;
return me->realdemux->out->pf_send(me->realdemux->out, p_es, p_block); std::list<Demuxed *>::const_iterator it;
for(it=me->queues.begin(); it!=me->queues.end();++it)
{
Demuxed *pair = *it;
if(pair->es_id == p_es)
{
block_ChainLastAppend(&pair->pp_queue_last, p_block);
break;
}
}
return VLC_SUCCESS;
} }
void AbstractStreamOutput::esOutDel(es_out_t *fakees, es_out_id_t *p_es) void AbstractStreamOutput::esOutDel(es_out_t *fakees, es_out_id_t *p_es)
{ {
AbstractStreamOutput *me = (AbstractStreamOutput *) fakees->p_sys; AbstractStreamOutput *me = (AbstractStreamOutput *) fakees->p_sys;
me->escount--; std::list<Demuxed *>::iterator it;
for(it=me->queues.begin(); it!=me->queues.end();++it)
{
if((*it)->es_id == p_es)
{
delete *it;
me->queues.erase(it);
break;
}
}
me->realdemux->out->pf_del(me->realdemux->out, p_es); me->realdemux->out->pf_del(me->realdemux->out, p_es);
} }
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#endif #endif
#include <string> #include <string>
#include <list>
#include <vlc_common.h> #include <vlc_common.h>
#include "StreamsType.hpp" #include "StreamsType.hpp"
...@@ -93,11 +94,12 @@ namespace adaptative ...@@ -93,11 +94,12 @@ namespace adaptative
int esCount() const; int esCount() const;
bool seekAble() const; bool seekAble() const;
void setPosition(mtime_t); void setPosition(mtime_t);
void sendToDecoder(mtime_t);
void dropQueues();
protected: protected:
mtime_t pcr; mtime_t pcr;
int group; int group;
int escount;
es_out_t *fakeesout; /* to intercept/proxy what is sent from demuxstream */ es_out_t *fakeesout; /* to intercept/proxy what is sent from demuxstream */
stream_t *demuxstream; stream_t *demuxstream;
bool seekable; bool seekable;
...@@ -109,6 +111,18 @@ namespace adaptative ...@@ -109,6 +111,18 @@ namespace adaptative
static void esOutDel(es_out_t *, es_out_id_t *); static void esOutDel(es_out_t *, es_out_id_t *);
static int esOutControl(es_out_t *, int, va_list); static int esOutControl(es_out_t *, int, va_list);
static void esOutDestroy(es_out_t *); static void esOutDestroy(es_out_t *);
class Demuxed
{
friend class AbstractStreamOutput;
Demuxed();
~Demuxed();
void drop();
es_out_id_t *es_id;
block_t *p_queue;
block_t **pp_queue_last;
};
std::list<Demuxed *> queues;
}; };
class MP4StreamOutput : public AbstractStreamOutput class MP4StreamOutput : public AbstractStreamOutput
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment