mirror of
https://github.com/libretro/ppsspp.git
synced 2024-12-06 16:09:43 +00:00
50e9e45d65
They bail on PointerWrap error or bad version.
79 lines
1.5 KiB
C++
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;
|
|
};
|
|
|