tsMuxer/tsMuxer/lpcmStreamReader.h

92 lines
3.4 KiB
C++

#ifndef __LPCM_STREAM_READER_H
#define __LPCM_STREAM_READER_H
#include "avPacket.h"
#include "simplePacketizerReader.h"
class LPCMStreamReader : public SimplePacketizerReader
{
public:
enum class LPCMHeaderType
{
htNone,
htM2TS,
htWAVE,
htWAVE64
};
LPCMStreamReader() : SimplePacketizerReader(), m_useNewStyleAudioPES(false), m_tmpFrameBuffer()
{
m_bitsPerSample = m_freq = m_channels = 0;
m_lfeExists = false;
m_headerType = LPCMHeaderType::htNone;
m_testMode = false;
m_firstFrame = true;
m_demuxMode = false;
// m_waveHeaderParsed = false;
m_curChunkLen = 0;
m_channels = 0;
m_frameRest = 0;
m_needPCMHdr = true;
m_openSizeWaveFormat = false; // WAVE data size unknown and zero
m_lastChannelRemapPos = 0;
}
void setNewStyleAudioPES(bool value) { m_useNewStyleAudioPES = value; }
int getTSDescriptor(uint8_t* dstBuff, bool blurayMode, bool hdmvDescriptors) override;
int getFreq() override { return m_freq; }
int getChannels() override { return m_channels; }
// void setDemuxMode(bool value) {m_demuxMode = value;}
void setFirstFrame(bool value) { m_firstFrame = value; }
bool beforeFileCloseEvent(File& file) override;
void setHeadersType(LPCMHeaderType value);
protected:
int getHeaderLen() override { return 4; }
int decodeFrame(uint8_t* buff, uint8_t* end, int& skipBytes, int& skipBeforeBytes) override;
uint8_t* findFrame(uint8_t* buff, uint8_t* end) override;
double getFrameDurationNano() override;
const CodecInfo& getCodecInfo() override;
const std::string getStreamInfo() override;
void writePESExtension(PESPacket* pesPacket, const AVPacket& avPacket) override;
void setTestMode(bool value) override { m_testMode = value; }
int writeAdditionData(uint8_t* dstBuffer, uint8_t* dstEnd, AVPacket& avPacket,
PriorityDataInfo* priorityData) override;
int readPacket(AVPacket& avPacket) override;
int flushPacket(AVPacket& avPacket) override;
void onSplitEvent() override { m_firstFrame = true; }
void setBuffer(uint8_t* data, int dataLen, bool lastBlock = false) override;
private:
LPCMHeaderType m_headerType;
bool m_useNewStyleAudioPES;
bool m_testMode;
bool m_firstFrame;
// bool m_demuxMode;
// bool m_waveHeaderParsed;
uint8_t m_tmpFrameBuffer[17280 + 4]; // max PCM frame size
int64_t m_frameRest;
bool m_needPCMHdr;
int m_bitsPerSample;
int m_freq;
int m_channels;
bool m_lfeExists;
int64_t m_curChunkLen;
bool m_openSizeWaveFormat;
uint8_t* m_lastChannelRemapPos;
bool detectLPCMType(uint8_t* buffer, int64_t len);
int decodeLPCMHeader(uint8_t* buff);
uint32_t convertLPCMToWAV(uint8_t* start, uint8_t* end);
uint32_t convertWavToPCM(uint8_t* start, uint8_t* end);
void storeChannelData(uint8_t* start, uint8_t* end, int chNum, uint8_t* tmpData, int mch);
void copyChannelData(uint8_t* start, uint8_t* end, int chFrom, int chTo, int mch);
void restoreChannelData(uint8_t* start, uint8_t* end, int chNum, uint8_t* tmpData, int mch);
void removeChannel(uint8_t* start, uint8_t* end, int cnNum, int mch);
int decodeWaveHeader(uint8_t* buff, uint8_t* end);
uint8_t* findSubstr(const char* pattern, uint8_t* buff, uint8_t* end);
};
#endif