ppsspp/Core/HW/MpegDemux.h
Unknown W. Brackets 50e9e45d65 Check version in each DoState() func.
They bail on PointerWrap error or bad version.
2013-09-14 20:23:03 -07:00

79 lines
1.5 KiB
C++

// This is a simple version MpegDemux that can get media's audio stream.
// Thanks to JPCSP project.
#pragma once
#include "../../Globals.h"
#include "Core/HW/atrac3plus.h"
#include "Common/ChunkFile.h"
class MpegDemux
{
public:
MpegDemux(int size, int offset);
~MpegDemux(void);
bool addStreamData(u8* buf, int addSize);
void demux(int audioChannel);
// return its framesize
int getNextaudioFrame(u8** buf, int *headerCode1, int *headerCode2);
private:
struct PesHeader {
long pts;
long dts;
int channel;
PesHeader(int chan) {
pts = 0;
dts = 0;
channel = chan;
}
};
int read8() {
return m_buf[m_index++] & 0xFF;
}
int read16() {
return (read8() << 8) | read8();
}
long readPts() {
return readPts(read8());
}
long readPts(int c) {
return (((long) (c & 0x0E)) << 29) | ((read16() >> 1) << 15) | (read16() >> 1);
}
bool isEOF() {
return m_index >= m_len;
}
void skip(int n) {
if (n > 0) {
m_index += n;
}
}
int readPesHeader(PesHeader &pesHeader, int length, int startCode);
int demuxStream(bool bdemux, int startCode, int channel);
public:
void DoState(PointerWrap &p) {
auto s = p.Section("MpegDemux", 1);
if (!s)
return;
p.Do(m_index);
p.Do(m_len);
p.Do(m_audioChannel);
p.Do(m_readSize);
if (m_buf)
p.DoArray(m_buf, m_len);
p.DoClass(m_audioStream);
}
private:
int m_index;
int m_len;
u8* m_buf;
Atrac3plus_Decoder::BufferQueue m_audioStream;
u8 m_audioFrame[0x2000];
int m_audioChannel;
int m_readSize;
};