Commit 0e9356ef authored by Francois Cartegnie's avatar Francois Cartegnie

demux: adaptative: add streamoutput recycling

parent de283d70
......@@ -48,7 +48,8 @@ AbstractStreamOutput::~AbstractStreamOutput()
{
}
BaseStreamOutput::BaseStreamOutput(demux_t *demux, const StreamFormat &format, const std::string &name) :
BaseStreamOutput::BaseStreamOutput(demux_t *demux, const StreamFormat &format, const std::string &name,
AbstractStreamOutput *recycled) :
AbstractStreamOutput(demux, format)
{
this->name = name;
......@@ -57,7 +58,18 @@ BaseStreamOutput::BaseStreamOutput(demux_t *demux, const StreamFormat &format, c
CommandsFactory *factory = new CommandsFactory();
/* Try to recycle compatible output if any */
BaseStreamOutput *my_recycled = dynamic_cast<BaseStreamOutput *>(recycled);
if(my_recycled)
{
fakeesout = my_recycled->fakeesout;
my_recycled->fakeesout = NULL;
}
else
{
fakeesout = new (std::nothrow) FakeESOut( realdemux->out, factory );
}
if (!fakeesout)
{
delete factory;
......@@ -75,6 +87,7 @@ BaseStreamOutput::~BaseStreamOutput()
if (demuxstream)
stream_Delete(demuxstream);
if(fakeesout)
delete fakeesout;
}
......@@ -163,4 +176,3 @@ void BaseStreamOutput::fillExtraFMTInfo( es_format_t *p_fmt ) const
if(!p_fmt->psz_description && !description.empty())
p_fmt->psz_description = strdup(description.c_str());
}
......@@ -67,7 +67,8 @@ namespace adaptative
{
public:
virtual ~AbstractStreamOutputFactory() {}
virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &) const = 0;
virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &,
AbstractStreamOutput * = NULL ) const = 0;
};
class BaseStreamOutput : public AbstractStreamOutput,
......@@ -76,7 +77,8 @@ namespace adaptative
friend class BaseStreamOutputEsOutControlPCRCommand;
public:
BaseStreamOutput(demux_t *, const StreamFormat &, const std::string &);
BaseStreamOutput(demux_t *, const StreamFormat &, const std::string &,
AbstractStreamOutput * = NULL);
virtual ~BaseStreamOutput();
virtual void pushBlock(block_t *, bool); /* reimpl */
virtual mtime_t getPCR() const; /* reimpl */
......
......@@ -48,18 +48,25 @@ using namespace dash::mpd;
using namespace adaptative::logic;
AbstractStreamOutput *DASHStreamOutputFactory::create(demux_t *demux, const StreamFormat &format) const
AbstractStreamOutput *DASHStreamOutputFactory::create(demux_t *demux, const StreamFormat &format,
AbstractStreamOutput *recycled) const
{
AbstractStreamOutput *ret = NULL;
unsigned fmt = format;
switch(fmt)
{
case DASHStreamFormat::MP4:
return new BaseStreamOutput(demux, format, "mp4");
ret = new BaseStreamOutput(demux, format, "mp4", recycled);
break;
case DASHStreamFormat::MPEG2TS:
return new BaseStreamOutput(demux, format, "ts");
ret = new BaseStreamOutput(demux, format, "ts", recycled);
break;
}
return NULL;
delete recycled;
return ret;
}
DASHManager::DASHManager(demux_t *demux_, MPD *mpd,
......
......@@ -37,7 +37,7 @@ namespace dash
class DASHStreamOutputFactory : public AbstractStreamOutputFactory
{
public:
virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &) const;
virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &, AbstractStreamOutput * = NULL) const;
};
class DASHManager : public PlaylistManager
......
......@@ -23,28 +23,34 @@
using namespace hls;
AbstractStreamOutput *HLSStreamOutputFactory::create(demux_t *demux, const StreamFormat &format) const
AbstractStreamOutput *HLSStreamOutputFactory::create(demux_t *demux, const StreamFormat &format,
AbstractStreamOutput *recycled) const
{
AbstractStreamOutput *ret = NULL;
unsigned fmt = format;
switch(fmt)
{
case HLSStreamFormat::PACKEDAAC:
return new HLSPackedStreamOutput(demux, format, "any");
ret = new HLSPackedStreamOutput(demux, format, "any", recycled);
break;
case HLSStreamFormat::UNKNOWN:
case HLSStreamFormat::MPEG2TS:
return new BaseStreamOutput(demux, format, "ts");
ret = new BaseStreamOutput(demux, format, "ts", recycled);
case HLSStreamFormat::UNSUPPORTED:
default:
break;
}
return NULL;
delete recycled;
return ret;
}
HLSPackedStreamOutput::HLSPackedStreamOutput(demux_t *demux, const StreamFormat &format, const std::string &name) :
BaseStreamOutput(demux, format, name)
HLSPackedStreamOutput::HLSPackedStreamOutput(demux_t *demux, const StreamFormat &format, const std::string &name,
AbstractStreamOutput *recycled) :
BaseStreamOutput(demux, format, name, recycled)
{
b_timestamps_offset_set = false;
}
......
......@@ -33,13 +33,15 @@ namespace hls
class HLSStreamOutputFactory : public AbstractStreamOutputFactory
{
public:
virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &) const;
virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &,
AbstractStreamOutput * = NULL) const;
};
class HLSPackedStreamOutput : public BaseStreamOutput
{
public:
HLSPackedStreamOutput(demux_t *, const StreamFormat &, const std::string &);
HLSPackedStreamOutput(demux_t *, const StreamFormat &, const std::string &,
AbstractStreamOutput * = NULL);
virtual void pushBlock(block_t *, bool); /* reimpl */
virtual void setPosition(mtime_t); /* reimpl */
......
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