106 lines
3.4 KiB
C++
106 lines
3.4 KiB
C++
#ifndef __MUXER_MANAGER_H
|
|
#define __MUXER_MANAGER_H
|
|
|
|
#include "abstractMuxer.h"
|
|
#include "bufferedFileWriter.h"
|
|
#include "bufferedReaderManager.h"
|
|
#include "metaDemuxer.h"
|
|
|
|
class FileFactory;
|
|
|
|
class MuxerManager
|
|
{
|
|
public:
|
|
static const uint32_t PHYSICAL_SECTOR_SIZE =
|
|
2048; // minimum write align requirement. Should be readed from OS in a next version
|
|
static const int BLURAY_SECTOR_SIZE =
|
|
PHYSICAL_SECTOR_SIZE * 3; // real sector size is 2048, but M2TS frame required addition rounding by 3 blocks
|
|
|
|
MuxerManager(const BufferedReaderManager& readManager, AbstractMuxerFactory& factory);
|
|
virtual ~MuxerManager();
|
|
|
|
void setAsyncMode(bool val) { m_asyncMode = val; }
|
|
|
|
// void setFileBlockSize ( uint32_t nFileBlockSize) { m_fileBlockSize = nFileBlockSize; }
|
|
// int32_t getFileBlockSize() const { return m_fileBlockSize; }
|
|
|
|
bool isAsyncMode() const { return m_asyncMode; }
|
|
|
|
virtual bool openMetaFile(const std::string& fileName);
|
|
int addStream(const std::string& codecName, const std::string& fileName,
|
|
const std::map<std::string, std::string>& addParams);
|
|
|
|
void doMux(const std::string& outFileName, FileFactory* fileFactory);
|
|
|
|
void setCutStart(int64_t value) { m_cutStart = value; }
|
|
int64_t getCutStart() const { return m_cutStart; }
|
|
|
|
void setCutEnd(int64_t value) { m_cutEnd = value; }
|
|
int64_t getCutEnd() const { return m_cutEnd; }
|
|
|
|
void waitForWriting();
|
|
|
|
virtual void asyncWriteBuffer(AbstractMuxer* muxer, uint8_t* buff, int len, AbstractOutputStream* dstFile);
|
|
virtual int syncWriteBuffer(AbstractMuxer* muxer, uint8_t* buff, int len, AbstractOutputStream* dstFile);
|
|
void muxBlockFinished(AbstractMuxer* muxer);
|
|
|
|
void parseMuxOpt(const std::string& opts);
|
|
int getTrackCnt() { return (int)m_metaDemuxer.getCodecInfo().size(); }
|
|
bool getHevcFound() { return m_metaDemuxer.m_HevcFound; }
|
|
AbstractMuxer* getMainMuxer();
|
|
AbstractMuxer* getSubMuxer();
|
|
bool isStereoMode() const;
|
|
|
|
void setAllowStereoMux(bool value);
|
|
|
|
bool isMvcBaseViewR() const { return m_mvcBaseViewR; }
|
|
int64_t totalSize() const { return m_metaDemuxer.totalSize(); }
|
|
int getExtraISOBlocks() const { return m_extraIsoBlocks; }
|
|
|
|
bool useReproducibleIsoHeader() const { return m_reproducibleIsoHeader; }
|
|
|
|
enum class SubTrackMode
|
|
{
|
|
All,
|
|
Forced
|
|
};
|
|
int getDefaultAudioTrackIdx() const;
|
|
int getDefaultSubTrackIdx(SubTrackMode& mode) const;
|
|
|
|
private:
|
|
void preinitMux(const std::string& outFileName, FileFactory* fileFactory);
|
|
AbstractMuxer* createMuxer();
|
|
void asyncWriteBlock(const WriterData& data);
|
|
void checkTrackList(const std::vector<StreamInfo>& ci);
|
|
|
|
private:
|
|
AbstractMuxer* m_mainMuxer;
|
|
AbstractMuxer* m_subMuxer;
|
|
|
|
bool m_asyncMode;
|
|
// int32_t m_fileBlockSize;
|
|
std::string m_outFileName;
|
|
std::condition_variable reinitCond;
|
|
METADemuxer m_metaDemuxer;
|
|
int64_t m_cutStart;
|
|
int64_t m_cutEnd;
|
|
BufferedFileWriter* m_fileWriter;
|
|
AbstractMuxerFactory& m_factory;
|
|
bool m_allowStereoMux;
|
|
std::set<int> m_subStreamIndex;
|
|
std::string m_muxOpts;
|
|
bool m_interleave;
|
|
|
|
std::vector<WriterData> m_delayedData; // ssif interlieave
|
|
bool m_subBlockFinished;
|
|
bool m_mainBlockFinished;
|
|
bool m_mvcBaseViewR;
|
|
int64_t m_ptsOffset;
|
|
int m_extraIsoBlocks;
|
|
bool m_bluRayMode;
|
|
bool m_demuxMode;
|
|
bool m_reproducibleIsoHeader = false;
|
|
};
|
|
|
|
#endif // __MUXER_MANAGER_H
|