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

demux: adaptative: add streamoutput recycling

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