63 lines
2.1 KiB
C++
63 lines
2.1 KiB
C++
#ifndef __PROGRAM_STREAM_DEMUXER_H
|
|
#define __PROGRAM_STREAM_DEMUXER_H
|
|
|
|
#include <set>
|
|
#include <vector>
|
|
|
|
#include "BufferedReader.h"
|
|
#include "abstractDemuxer.h"
|
|
#include "bufferedReaderManager.h"
|
|
#include "vodCoreException.h"
|
|
|
|
class ProgramStreamDemuxer : public AbstractDemuxer
|
|
{
|
|
public:
|
|
const static int MAX_PES_HEADER_SIZE = 1018; // buffer for PES header and program stream map
|
|
|
|
ProgramStreamDemuxer(const BufferedReaderManager& readManager);
|
|
void openFile(const std::string& streamName) override;
|
|
virtual int readPacket(AVPacket& avPacket) { return 0; }
|
|
~ProgramStreamDemuxer() override;
|
|
int simpleDemuxBlock(DemuxedData& demuxedData, const PIDSet& acceptedPIDs, int64_t& discardSize) override;
|
|
void getTrackList(std::map<uint32_t, TrackInfo>& trackList) override;
|
|
void readClose() override;
|
|
uint64_t getDemuxedSize() override;
|
|
int getLastReadRez() override { return m_lastReadRez; };
|
|
void setFileIterator(FileNameIterator* itr) override;
|
|
int64_t getTrackDelay(uint32_t pid) override
|
|
{
|
|
if (m_firstPtsTime.find(pid) != m_firstPtsTime.end())
|
|
return (int64_t)((m_firstPtsTime[pid] - (m_firstVideoPTS != -1 ? m_firstVideoPTS : m_firstPTS)) / 90.0 +
|
|
0.5); // convert to ms
|
|
else
|
|
return 0;
|
|
}
|
|
int64_t getFileDurationNano() const override;
|
|
|
|
private:
|
|
uint32_t m_tmpBufferLen;
|
|
uint8_t m_tmpBuffer[MAX_PES_HEADER_SIZE]; // TS_FRAME_SIZE
|
|
uint32_t m_lastPesLen;
|
|
uint32_t m_lastPID;
|
|
const BufferedReaderManager& m_readManager;
|
|
uint64_t m_dataProcessed;
|
|
std::string m_streamName;
|
|
int m_readerID;
|
|
int m_lastReadRez;
|
|
AbstractReader* m_bufferedReader;
|
|
uint8_t m_psm_es_type[256];
|
|
|
|
std::map<int, int64_t> m_firstPtsTime;
|
|
int64_t m_firstVideoPTS;
|
|
int64_t m_firstPTS;
|
|
MemoryBlock m_lpcmWaveHeader[16];
|
|
bool m_lpcpHeaderAdded[16];
|
|
|
|
private:
|
|
bool isVideoPID(uint32_t pid);
|
|
int mpegps_psm_parse(uint8_t* buff, uint8_t* end);
|
|
uint8_t processPES(uint8_t* buff, uint8_t* end, int& afterPesHeader);
|
|
};
|
|
|
|
#endif
|