vlc | branch: master | Francois Cartegnie <[email protected]> | Wed Jul 15 21:41:40 2015 +0200| [9875cd9a2e957049c12309b576a8ca4e016c8fd1] | committer: Francois Cartegnie
demux: hls: handle packed audio ID3 time offset > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9875cd9a2e957049c12309b576a8ca4e016c8fd1 --- modules/demux/Makefile.am | 2 + modules/demux/hls/HLSManager.cpp | 18 --------- modules/demux/hls/HLSManager.hpp | 6 --- modules/demux/hls/HLSStreams.cpp | 77 ++++++++++++++++++++++++++++++++++++++ modules/demux/hls/HLSStreams.hpp | 47 +++++++++++++++++++++++ modules/demux/hls/hls.cpp | 1 + 6 files changed, 127 insertions(+), 24 deletions(-) diff --git a/modules/demux/Makefile.am b/modules/demux/Makefile.am index 8c5342a..7f3b93a 100644 --- a/modules/demux/Makefile.am +++ b/modules/demux/Makefile.am @@ -374,6 +374,8 @@ libhls_plugin_la_SOURCES = \ demux/hls/HLSManager.hpp \ demux/hls/HLSManager.cpp \ demux/hls/HLSStreamFormat.hpp \ + demux/hls/HLSStreams.hpp \ + demux/hls/HLSStreams.cpp \ demux/hls/hls.cpp \ demux/hls/hls.hpp diff --git a/modules/demux/hls/HLSManager.cpp b/modules/demux/hls/HLSManager.cpp index e9308fd..a6e9b21 100644 --- a/modules/demux/hls/HLSManager.cpp +++ b/modules/demux/hls/HLSManager.cpp @@ -23,7 +23,6 @@ #endif #include "HLSManager.hpp" -#include "HLSStreamFormat.hpp" #include "../adaptative/logic/RateBasedAdaptationLogic.h" #include "../adaptative/tools/Retrieve.hpp" #include "playlist/Parser.hpp" @@ -35,23 +34,6 @@ using namespace adaptative::logic; using namespace hls; using namespace hls::playlist; -AbstractStreamOutput *HLSStreamOutputFactory::create(demux_t *demux, const StreamFormat &format) const -{ - unsigned fmt = format; - switch(fmt) - { - case HLSStreamFormat::PACKEDAAC: - return new BaseStreamOutput(demux, format, "any"); - break; - - default: - case HLSStreamFormat::UNKNOWN: - case HLSStreamFormat::MPEG2TS: - return new BaseStreamOutput(demux, format, "ts"); - } - return NULL; -} - HLSManager::HLSManager(M3U8 *playlist, AbstractStreamOutputFactory *factory, AbstractAdaptationLogic::LogicType type, stream_t *stream) : diff --git a/modules/demux/hls/HLSManager.hpp b/modules/demux/hls/HLSManager.hpp index 0fedb5c..09fe3bb 100644 --- a/modules/demux/hls/HLSManager.hpp +++ b/modules/demux/hls/HLSManager.hpp @@ -28,12 +28,6 @@ namespace hls { using namespace adaptative; - class HLSStreamOutputFactory : public AbstractStreamOutputFactory - { - public: - virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &) const; - }; - class HLSManager : public PlaylistManager { public: diff --git a/modules/demux/hls/HLSStreams.cpp b/modules/demux/hls/HLSStreams.cpp new file mode 100644 index 0000000..1d75edc --- /dev/null +++ b/modules/demux/hls/HLSStreams.cpp @@ -0,0 +1,77 @@ +/* + * HLSStreams.cpp + ***************************************************************************** + * Copyright (C) 2015 - VideoLAN authors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ +#include "HLSStreams.hpp" +#include "HLSStreamFormat.hpp" +#include <vlc_demux.h> + +using namespace hls; + +AbstractStreamOutput *HLSStreamOutputFactory::create(demux_t *demux, const StreamFormat &format) const +{ + unsigned fmt = format; + switch(fmt) + { + case HLSStreamFormat::PACKEDAAC: + return new HLSPackedStreamOutput(demux, format, "any"); + break; + + default: + case HLSStreamFormat::UNKNOWN: + case HLSStreamFormat::MPEG2TS: + return new BaseStreamOutput(demux, format, "ts"); + } + return NULL; +} + +HLSPackedStreamOutput::HLSPackedStreamOutput(demux_t *demux, const StreamFormat &format, const std::string &name) : + BaseStreamOutput(demux, format, name) +{ + +} + +void HLSPackedStreamOutput::pushBlock(block_t *p_block, bool b_first) +{ + if(b_first && p_block && p_block->i_buffer >= 10 && !memcmp(p_block->p_buffer, "ID3", 3)) + { + uint32_t size = GetDWBE(&p_block->p_buffer[6]) + 10; + size = __MIN(p_block->i_buffer, size); + if(size >= 73 && timestamps_offset == VLC_TS_INVALID) + { + if(!memcmp(&p_block->p_buffer[10], "PRIV", 4) && + !memcmp(&p_block->p_buffer[20], "com.apple.streaming.transportStreamTimestamp", 45)) + { + setTimestampOffset( GetQWBE(&p_block->p_buffer[65]) * 100 / 9 ); + } + } + + /* Skip ID3 for demuxer */ + p_block->p_buffer += size; + p_block->i_buffer -= size; + } + + BaseStreamOutput::pushBlock(p_block, b_first); +} + +void HLSPackedStreamOutput::setPosition(mtime_t nztime) +{ + BaseStreamOutput::setPosition(nztime); + /* Should be correct, has a restarted demux shouldn't have been fed with data yet */ + setTimestampOffset(VLC_TS_INVALID - VLC_TS_0); +} diff --git a/modules/demux/hls/HLSStreams.hpp b/modules/demux/hls/HLSStreams.hpp new file mode 100644 index 0000000..93e1eaf --- /dev/null +++ b/modules/demux/hls/HLSStreams.hpp @@ -0,0 +1,47 @@ +/* + * HLSStreams.hpp + ***************************************************************************** + * Copyright (C) 2015 - VideoLAN authors + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ +#ifndef HLSSTREAM_HPP +#define HLSSTREAM_HPP + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "../adaptative/Streams.hpp" + +namespace hls +{ + using namespace adaptative; + + class HLSStreamOutputFactory : public AbstractStreamOutputFactory + { + public: + virtual AbstractStreamOutput *create(demux_t*, const StreamFormat &) const; + }; + + class HLSPackedStreamOutput : public BaseStreamOutput + { + public: + HLSPackedStreamOutput(demux_t *, const StreamFormat &, const std::string &); + virtual void pushBlock(block_t *, bool); /* reimpl */ + virtual void setPosition(mtime_t); /* reimpl */ + }; +} +#endif // HLSSTREAMS_HPP diff --git a/modules/demux/hls/hls.cpp b/modules/demux/hls/hls.cpp index d40070c..19984dd 100644 --- a/modules/demux/hls/hls.cpp +++ b/modules/demux/hls/hls.cpp @@ -37,6 +37,7 @@ #include "../adaptative/logic/AbstractAdaptationLogic.h" #include "HLSManager.hpp" +#include "HLSStreams.hpp" #include "playlist/Parser.hpp" #include "playlist/M3U8.hpp" _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
