mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Detect audio end separately from video end.
Fixes Crisis Core, broken by Wipeout Pure fix.
This commit is contained in:
parent
1a987dda26
commit
4de27773d2
4 changed files with 12 additions and 3 deletions
|
@ -1053,7 +1053,8 @@ int sceMpegGetAtracAu(u32 mpeg, u32 streamId, u32 auAddr, u32 attrAddr)
|
|||
streamInfo->second.needsReset = false;
|
||||
}
|
||||
|
||||
if (mpegRingbuffer.packetsFree == mpegRingbuffer.packets) {
|
||||
// The audio can end earlier than the video does.
|
||||
if (mpegRingbuffer.packetsFree == mpegRingbuffer.packets || (ctx->mediaengine->IsAudioEnd() && !ctx->mediaengine->IsVideoEnd())) {
|
||||
DEBUG_LOG(HLE, "PSP_ERROR_MPEG_NO_DATA=sceMpegGetAtracAu(%08x, %08x, %08x, %08x)", mpeg, streamId, auAddr, attrAddr);
|
||||
// TODO: Does this really delay?
|
||||
return hleDelayResult(PSP_ERROR_MPEG_NO_DATA, "mpeg get atrac", mpegDecodeErrorDelayMs);
|
||||
|
|
|
@ -92,6 +92,7 @@ MediaEngine::MediaEngine(): m_streamSize(0), m_readSize(0), m_decodedPos(0), m_p
|
|||
m_demux = 0;
|
||||
m_audioContext = 0;
|
||||
m_isVideoEnd = false;
|
||||
m_isAudioEnd = false;
|
||||
}
|
||||
|
||||
MediaEngine::~MediaEngine() {
|
||||
|
@ -130,6 +131,7 @@ void MediaEngine::closeMedia() {
|
|||
m_demux = 0;
|
||||
Atrac3plus_Decoder::CloseContext(&m_audioContext);
|
||||
m_isVideoEnd = false;
|
||||
m_isAudioEnd = false;
|
||||
}
|
||||
|
||||
int _MpegReadbuffer(void *opaque, uint8_t *buf, int buf_size)
|
||||
|
@ -220,6 +222,7 @@ bool MediaEngine::openContext() {
|
|||
m_audioPos = 0;
|
||||
m_audioContext = Atrac3plus_Decoder::OpenContext();
|
||||
m_isVideoEnd = false;
|
||||
m_isAudioEnd = false;
|
||||
m_decodedPos = mpegoffset;
|
||||
#endif // USE_FFMPEG
|
||||
return true;
|
||||
|
@ -561,6 +564,7 @@ int MediaEngine::getAudioSamples(u8* buffer) {
|
|||
int audioSize = m_demux->getaudioStream(&audioStream);
|
||||
if (m_audioPos >= audioSize || !isHeader(audioStream, m_audioPos))
|
||||
{
|
||||
m_isAudioEnd = m_demux->getFilePosition() >= m_streamSize;
|
||||
return 0;
|
||||
}
|
||||
u8 headerCode1 = audioStream[2];
|
||||
|
@ -588,6 +592,7 @@ int MediaEngine::getAudioSamples(u8* buffer) {
|
|||
} else
|
||||
m_audioPos = audioSize;
|
||||
m_audiopts += 4180;
|
||||
m_decodedPos += frameSize;
|
||||
return outbytes;
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,8 @@ public:
|
|||
s64 getAudioTimeStamp();
|
||||
s64 getLastTimeStamp();
|
||||
|
||||
bool IsVideoEnd() { return m_isVideoEnd;}
|
||||
bool IsVideoEnd() { return m_isVideoEnd; }
|
||||
bool IsAudioEnd() { return m_isAudioEnd; }
|
||||
|
||||
void DoState(PointerWrap &p) {
|
||||
p.Do(m_streamSize);
|
||||
|
@ -101,4 +102,5 @@ public:
|
|||
s64 m_audiopts;
|
||||
|
||||
bool m_isVideoEnd;
|
||||
bool m_isAudioEnd;
|
||||
};
|
||||
|
|
|
@ -15,8 +15,9 @@ public:
|
|||
|
||||
void demux();
|
||||
|
||||
// return it's size
|
||||
// return its size
|
||||
int getaudioStream(u8 **audioStream);
|
||||
int getFilePosition() { return m_index; }
|
||||
private:
|
||||
struct PesHeader {
|
||||
long pts;
|
||||
|
|
Loading…
Add table
Reference in a new issue