diff options
author | Christian Gmeiner <christian.gmeiner@gmail.com> | 2009-04-18 22:06:19 +0200 |
---|---|---|
committer | Christian Gmeiner <christian.gmeiner@gmail.com> | 2009-04-18 22:06:19 +0200 |
commit | 6e20ef91e3a98a520485ab75044f2ef50bb44519 (patch) | |
tree | 1a9f84213dc91589d061a8d151c4f36c302eeb6d /dxr3demuxdevice.c | |
parent | 20e7abde6689b41807e84f1074b8e747622cf03b (diff) | |
download | vdr-plugin-dxr3-6e20ef91e3a98a520485ab75044f2ef50bb44519.tar.gz vdr-plugin-dxr3-6e20ef91e3a98a520485ab75044f2ef50bb44519.tar.bz2 |
fix coding style before starting rewrite
Diffstat (limited to 'dxr3demuxdevice.c')
-rw-r--r-- | dxr3demuxdevice.c | 713 |
1 files changed, 321 insertions, 392 deletions
diff --git a/dxr3demuxdevice.c b/dxr3demuxdevice.c index e60d2e4..741ccfd 100644 --- a/dxr3demuxdevice.c +++ b/dxr3demuxdevice.c @@ -209,363 +209,299 @@ int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts) */ if (m_pAudioThread->NeedResync() || m_pVideoThread->NeedResync()) - { - Resync(); - if (m_demuxMode == DXR3_DEMUX_REPLAY_MODE) - { - SetReplayMode(); - } - m_aBuf.Clear(); - m_vBuf.Clear(); - m_pAudioThread->ClearResyncRequest(); - m_pVideoThread->ClearResyncRequest(); - m_aDecoder.Reset(); - lastPts = 0; - aPts = 0; - vPts = 0; - bPlaySuc = false; +{ + Resync(); + if (m_demuxMode == DXR3_DEMUX_REPLAY_MODE) + { + SetReplayMode(); + } + m_aBuf.Clear(); + m_vBuf.Clear(); + m_pAudioThread->ClearResyncRequest(); + m_pVideoThread->ClearResyncRequest(); + m_aDecoder.Reset(); + lastPts = 0; + aPts = 0; + vPts = 0; + bPlaySuc = false; } if (m_demuxMode == DXR3_DEMUX_OFF_MODE) { - m_demuxMode = DXR3_DEMUX_TV_MODE; - m_synchState = DXR3_DEMUX_UNSYNCHED; + m_demuxMode = DXR3_DEMUX_TV_MODE; + m_synchState = DXR3_DEMUX_UNSYNCHED; - lastPts = 0; - aPts = 0; - vPts = 0; - bPlaySuc = false; + lastPts = 0; + aPts = 0; + vPts = 0; + bPlaySuc = false; } // find start code try { - cDxr3PesFrame pesFrame; - - pesFrame.ExtractNextFrame(buf, length); - - while (pesFrame.IsValid()) - { - if (pesFrame.GetPayloadLength() > (uint32_t) VIDEO_MAX_FRAME_SIZE) - { - throw (cDxr3PesFrame::PES_GENERAL_ERROR); - }; - if (pesFrame.GetPts() != lastPts) - { - pts = lastPts = pesFrame.GetPts(); - } - else - { - pts = 0; - } - - if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_VIDEO_DATA) - { - /* - m_dxr3Device.PlayVideoFrame(pesFrame.GetEsStart(), - (int) (pesFrame.GetPayloadLength())); - */ - - if (m_demuxMode == DXR3_DEMUX_TRICK_MODE) - { - switch (pesFrame.GetFrameType()) - { - case I_FRAME: - dsyslog("dxr3: demux: I-frame"); - m_dxr3Device.SingleStep(); - bPlaySuc = true; - //if (bPlayedFrame) return length; - bPlayedFrame = true; - m_dxr3Device.SetHorizontalSize(pesFrame.GetHorizontalSize()); - m_dxr3Device.SetVerticalSize(pesFrame.GetVerticalSize()); - m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), (int) (pesFrame.GetPayloadLength()), m_ReUseFrame); - break; - - case UNKNOWN_FRAME: - dsyslog("dxr3: demux: unknown frame"); - if (bPlaySuc) - { - m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), (int) (pesFrame.GetPayloadLength()), m_ReUseFrame); - } - break; - - default: - dsyslog("dxr3: demux: default frame"); - if (bPlaySuc) - { - m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), (int) (pesFrame.GetOffset()), m_ReUseFrame); - } - - bPlaySuc = false; - break; - } - - } - else if (m_demuxMode == DXR3_DEMUX_VIDEO_ONLY_MODE) - { - m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), - (int)(pesFrame.GetPayloadLength())); - } - else if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED || - m_synchState == DXR3_DEMUX_SYNCHED) - { - m_dxr3Device.SetHorizontalSize(pesFrame.GetHorizontalSize()); - m_dxr3Device.SetVerticalSize(pesFrame.GetVerticalSize()); - while (!Poll(100)); - cFixedLengthFrame* pTempFrame = m_vBuf.Push(pesFrame.GetPayload(), (int) (pesFrame.GetPayloadLength()), pts, ftVideo); - if (!pTempFrame) /* Push Timeout */ - throw (cDxr3PesFrame::PES_GENERAL_ERROR); - - pTempFrame->SetAspectRatio(pesFrame.GetAspectRatio()); - - m_aBuf.WakeUp(); - - if (m_vBuf.GetFillLevel() > 5 && - m_synchState != DXR3_DEMUX_SYNCHED) - { - m_synchState = DXR3_DEMUX_SYNCHED; - pcr = vPts - PRE_BUFFER_LENGTH; - m_dxr3Device.SetSysClock(pcr); - m_dxr3Device.SetPlayMode(); - m_dxr3Device.EnableVideo(); - m_dxr3Device.EnableAudio(); - m_vBuf.Start(); - m_aBuf.Start(); - } - } - else - { - if (pesFrame.GetFrameType() == I_FRAME) - { - vPts = pts; - - m_dxr3Device.SetHorizontalSize(pesFrame.GetHorizontalSize()); - m_dxr3Device.SetVerticalSize(pesFrame.GetVerticalSize()); - cFixedLengthFrame* pTempFrame = m_vBuf.Push(pesFrame.GetPayload(), (int) (pesFrame.GetPayloadLength()), pts, ftVideo); - if (!pTempFrame) /* Push Timeout */ - throw (cDxr3PesFrame::PES_GENERAL_ERROR); - - pTempFrame->SetAspectRatio(pesFrame.GetAspectRatio()); - - if (m_synchState == DXR3_DEMUX_AUDIO_SYNCHED) - { - m_synchState = DXR3_DEMUX_SYNCHED; - } - else - { - m_synchState = DXR3_DEMUX_VIDEO_SYNCHED; - } - if (m_synchState == DXR3_DEMUX_SYNCHED) - { - if (!vPts) vPts = aPts; - if (aPts < vPts) - { - pcr = aPts - PRE_BUFFER_LENGTH; - } - else - { - pcr = vPts - PRE_BUFFER_LENGTH; - } - m_dxr3Device.SetSysClock(pcr); - m_dxr3Device.SetPlayMode(); - m_dxr3Device.EnableVideo(); - m_dxr3Device.EnableAudio(); - m_vBuf.Start(); - m_aBuf.Start(); - } - } - } - - } - else if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_AUDIO_DATA - && m_demuxMode != DXR3_DEMUX_VIDEO_ONLY_MODE - && !cDxr3Interface::Instance().IsAudioModeAC3()) - { - if (m_synchState == DXR3_DEMUX_AUDIO_SYNCHED || - m_synchState == DXR3_DEMUX_SYNCHED) - { - if (pts && m_synchState != DXR3_DEMUX_SYNCHED) - { - m_synchState = DXR3_DEMUX_SYNCHED; - pcr = aPts - PRE_BUFFER_LENGTH; - m_dxr3Device.SetSysClock(pcr); - m_dxr3Device.SetPlayMode(); - m_dxr3Device.EnableVideo(); - m_dxr3Device.EnableAudio(); - m_vBuf.Start(); - m_aBuf.Start(); - } - while(!Poll(100)); - m_aDecoder.Decode(pesFrame.GetPayload(), - (int) (pesFrame.GetPayloadLength()), - pts, m_aBuf); - - } - else - { - if (pts) - { - aPts = pts; - - m_aDecoder.Decode(pesFrame.GetPayload(), - (int) (pesFrame.GetPayloadLength()), - pts, m_aBuf); - - if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED) - { - m_synchState = DXR3_DEMUX_SYNCHED; - } - else - { - m_synchState = DXR3_DEMUX_AUDIO_SYNCHED; - } - if (m_synchState == DXR3_DEMUX_SYNCHED) - { - if (!vPts) vPts = aPts; - if (aPts < vPts) - { - pcr = aPts - PRE_BUFFER_LENGTH; - } - else - { - pcr = vPts - PRE_BUFFER_LENGTH; - } - m_dxr3Device.SetSysClock(pcr); - m_dxr3Device.SetPlayMode(); - m_dxr3Device.EnableVideo(); - m_dxr3Device.EnableAudio(); - m_vBuf.Start(); - m_aBuf.Start(); - } - } - } - } - else if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA - && m_demuxMode != DXR3_DEMUX_VIDEO_ONLY_MODE - && !cDxr3Interface::Instance().IsAudioModeAC3() - && !bAc3Dts) - { - if (m_synchState == DXR3_DEMUX_AUDIO_SYNCHED || - m_synchState == DXR3_DEMUX_SYNCHED) - { - m_aDecoder.DecodeLpcm(pesFrame.GetPayload(), - pesFrame.GetPayloadLength(), pts, m_aBuf); - } - else - { - if (pts) - { - aPts = pts; - m_aDecoder.DecodeLpcm(pesFrame.GetPayload(), - pesFrame.GetPayloadLength(), - pts, m_aBuf); - - if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED) - { - m_synchState = DXR3_DEMUX_SYNCHED; - } - else - { - m_synchState = DXR3_DEMUX_AUDIO_SYNCHED; - } - if (m_synchState == DXR3_DEMUX_SYNCHED) - { - if (!vPts) vPts = aPts; - if (aPts < vPts) - { - pcr = aPts - PRE_BUFFER_LENGTH; - } - else - { - pcr = vPts - PRE_BUFFER_LENGTH; - } - m_dxr3Device.SetSysClock(pcr); - m_dxr3Device.SetPlayMode(); - m_dxr3Device.EnableVideo(); - m_dxr3Device.EnableAudio(); - m_vBuf.Start(); - m_aBuf.Start(); - } - } - } - } - else if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA - && m_demuxMode != DXR3_DEMUX_VIDEO_ONLY_MODE - && cDxr3Interface::Instance().IsAudioModeAC3() - && bAc3Dts) - { - if (m_synchState == DXR3_DEMUX_AUDIO_SYNCHED || - m_synchState == DXR3_DEMUX_SYNCHED) - { - m_aDecoder.DecodeAc3Dts(pesFrame.GetPesStart(), - pesFrame.GetPayload(), - pesFrame.GetPayloadLength(), - pts, m_aBuf); - } - else - { - if (pts) - { - aPts = pts; - m_aDecoder.DecodeAc3Dts(pesFrame.GetPesStart(), - pesFrame.GetPayload(), - pesFrame.GetPayloadLength(), - pts, m_aBuf); - - if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED) - { - m_synchState = DXR3_DEMUX_SYNCHED; - } - else - { - m_synchState = DXR3_DEMUX_AUDIO_SYNCHED; - } - if (m_synchState == DXR3_DEMUX_SYNCHED) - { - if (!vPts) vPts = aPts; - if (aPts < vPts) - { - pcr = aPts - PRE_BUFFER_LENGTH; - } - else - { - pcr = vPts - PRE_BUFFER_LENGTH; - } - m_dxr3Device.SetSysClock(pcr); - m_dxr3Device.SetPlayMode(); - m_dxr3Device.EnableVideo(); - m_dxr3Device.EnableAudio(); - m_vBuf.Start(); - m_aBuf.Start(); - } - } - } - - } - - if (pesFrame.IsValid()) - { - pesFrame.ExtractNextFrame(pesFrame.GetNextStart(), - pesFrame.GetRemainingLength()); - } - - } - - length -= pesFrame.GetRemainingLength(); - - //if (m_demuxMode == DXR3_DEMUX_TRICK_MODE) return origLength; - return length; - } - catch (cDxr3PesFrame::ePesFrameError err) - { - dsyslog("cDxr3DemuxDevice::DemuxPes() ePesFrameError skipping data and resync"); - Resync(); - return origLength; - } - catch (cDxr3SyncBuffer::eSyncBufferException err) - { - Stop(); - return origLength; + cDxr3PesFrame pesFrame; + + pesFrame.ExtractNextFrame(buf, length); + + while (pesFrame.IsValid()) { + if (pesFrame.GetPayloadLength() > (uint32_t) VIDEO_MAX_FRAME_SIZE) { + throw (cDxr3PesFrame::PES_GENERAL_ERROR); + }; + if (pesFrame.GetPts() != lastPts) { + pts = lastPts = pesFrame.GetPts(); + } else { + pts = 0; + } + + if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_VIDEO_DATA) { + /* + m_dxr3Device.PlayVideoFrame(pesFrame.GetEsStart(), + (int) (pesFrame.GetPayloadLength())); + */ + + if (m_demuxMode == DXR3_DEMUX_TRICK_MODE) { + switch (pesFrame.GetFrameType()) { + case I_FRAME: + dsyslog("dxr3: demux: I-frame"); + m_dxr3Device.SingleStep(); + bPlaySuc = true; + //if (bPlayedFrame) return length; + bPlayedFrame = true; + m_dxr3Device.SetHorizontalSize(pesFrame.GetHorizontalSize()); + m_dxr3Device.SetVerticalSize(pesFrame.GetVerticalSize()); + m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), (int) (pesFrame.GetPayloadLength()), m_ReUseFrame); + break; + + case UNKNOWN_FRAME: + dsyslog("dxr3: demux: unknown frame"); + if (bPlaySuc) { + m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), (int) (pesFrame.GetPayloadLength()), m_ReUseFrame); + } + break; + + default: + dsyslog("dxr3: demux: default frame"); + if (bPlaySuc) { + m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), (int) (pesFrame.GetOffset()), m_ReUseFrame); + } + + bPlaySuc = false; + break; + } + + } else if (m_demuxMode == DXR3_DEMUX_VIDEO_ONLY_MODE) { + m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), (int)(pesFrame.GetPayloadLength())); + + } else if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED || + m_synchState == DXR3_DEMUX_SYNCHED) { + m_dxr3Device.SetHorizontalSize(pesFrame.GetHorizontalSize()); + m_dxr3Device.SetVerticalSize(pesFrame.GetVerticalSize()); + while (!Poll(100)); + cFixedLengthFrame* pTempFrame = m_vBuf.Push(pesFrame.GetPayload(), (int) (pesFrame.GetPayloadLength()), pts, ftVideo); + if (!pTempFrame) /* Push Timeout */ + throw (cDxr3PesFrame::PES_GENERAL_ERROR); + + pTempFrame->SetAspectRatio(pesFrame.GetAspectRatio()); + + m_aBuf.WakeUp(); + + if (m_vBuf.GetFillLevel() > 5 && m_synchState != DXR3_DEMUX_SYNCHED) { + m_synchState = DXR3_DEMUX_SYNCHED; + pcr = vPts - PRE_BUFFER_LENGTH; + m_dxr3Device.SetSysClock(pcr); + m_dxr3Device.SetPlayMode(); + m_dxr3Device.EnableVideo(); + m_dxr3Device.EnableAudio(); + m_vBuf.Start(); + m_aBuf.Start(); + } + } else { + if (pesFrame.GetFrameType() == I_FRAME) { + vPts = pts; + + m_dxr3Device.SetHorizontalSize(pesFrame.GetHorizontalSize()); + m_dxr3Device.SetVerticalSize(pesFrame.GetVerticalSize()); + cFixedLengthFrame* pTempFrame = m_vBuf.Push(pesFrame.GetPayload(), (int) (pesFrame.GetPayloadLength()), pts, ftVideo); + if (!pTempFrame) /* Push Timeout */ + throw (cDxr3PesFrame::PES_GENERAL_ERROR); + + pTempFrame->SetAspectRatio(pesFrame.GetAspectRatio()); + + if (m_synchState == DXR3_DEMUX_AUDIO_SYNCHED) { + m_synchState = DXR3_DEMUX_SYNCHED; + } else { + m_synchState = DXR3_DEMUX_VIDEO_SYNCHED; + } + if (m_synchState == DXR3_DEMUX_SYNCHED) { + if (!vPts) { + vPts = aPts; + } + if (aPts < vPts) { + pcr = aPts - PRE_BUFFER_LENGTH; + } else { + pcr = vPts - PRE_BUFFER_LENGTH; + } + m_dxr3Device.SetSysClock(pcr); + m_dxr3Device.SetPlayMode(); + m_dxr3Device.EnableVideo(); + m_dxr3Device.EnableAudio(); + m_vBuf.Start(); + m_aBuf.Start(); + } + } + } + + } else if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_AUDIO_DATA + && m_demuxMode != DXR3_DEMUX_VIDEO_ONLY_MODE + && !cDxr3Interface::Instance().IsAudioModeAC3()) { + if (m_synchState == DXR3_DEMUX_AUDIO_SYNCHED || + m_synchState == DXR3_DEMUX_SYNCHED) { + if (pts && m_synchState != DXR3_DEMUX_SYNCHED) { + m_synchState = DXR3_DEMUX_SYNCHED; + pcr = aPts - PRE_BUFFER_LENGTH; + m_dxr3Device.SetSysClock(pcr); + m_dxr3Device.SetPlayMode(); + m_dxr3Device.EnableVideo(); + m_dxr3Device.EnableAudio(); + m_vBuf.Start(); + m_aBuf.Start(); + } + while(!Poll(100)); + m_aDecoder.Decode(pesFrame.GetPayload(), + (int) (pesFrame.GetPayloadLength()), + pts, m_aBuf); + + } else { + if (pts) { + aPts = pts; + + m_aDecoder.Decode(pesFrame.GetPayload(), + (int) (pesFrame.GetPayloadLength()), + pts, m_aBuf); + + if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED) { + m_synchState = DXR3_DEMUX_SYNCHED; + } else { + m_synchState = DXR3_DEMUX_AUDIO_SYNCHED; + } + if (m_synchState == DXR3_DEMUX_SYNCHED) { + if (!vPts) { + vPts = aPts; + } + if (aPts < vPts) { + pcr = aPts - PRE_BUFFER_LENGTH; + } else { + pcr = vPts - PRE_BUFFER_LENGTH; + } + m_dxr3Device.SetSysClock(pcr); + m_dxr3Device.SetPlayMode(); + m_dxr3Device.EnableVideo(); + m_dxr3Device.EnableAudio(); + m_vBuf.Start(); + m_aBuf.Start(); + } + } + } + } else if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA + && m_demuxMode != DXR3_DEMUX_VIDEO_ONLY_MODE + && !cDxr3Interface::Instance().IsAudioModeAC3() + && !bAc3Dts) { + if (m_synchState == DXR3_DEMUX_AUDIO_SYNCHED || + m_synchState == DXR3_DEMUX_SYNCHED) { + m_aDecoder.DecodeLpcm(pesFrame.GetPayload(), + pesFrame.GetPayloadLength(), pts, m_aBuf); + } else { + if (pts) { + aPts = pts; + m_aDecoder.DecodeLpcm(pesFrame.GetPayload(), + pesFrame.GetPayloadLength(), + pts, m_aBuf); + + if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED) { + m_synchState = DXR3_DEMUX_SYNCHED; + } else { + m_synchState = DXR3_DEMUX_AUDIO_SYNCHED; + } + if (m_synchState == DXR3_DEMUX_SYNCHED) { + if (!vPts) { + vPts = aPts; + } + if (aPts < vPts) { + pcr = aPts - PRE_BUFFER_LENGTH; + } else { + pcr = vPts - PRE_BUFFER_LENGTH; + } + m_dxr3Device.SetSysClock(pcr); + m_dxr3Device.SetPlayMode(); + m_dxr3Device.EnableVideo(); + m_dxr3Device.EnableAudio(); + m_vBuf.Start(); + m_aBuf.Start(); + } + } + } + } else if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA + && m_demuxMode != DXR3_DEMUX_VIDEO_ONLY_MODE + && cDxr3Interface::Instance().IsAudioModeAC3() + && bAc3Dts) { + if (m_synchState == DXR3_DEMUX_AUDIO_SYNCHED || + m_synchState == DXR3_DEMUX_SYNCHED) { + m_aDecoder.DecodeAc3Dts(pesFrame.GetPesStart(), + pesFrame.GetPayload(), + pesFrame.GetPayloadLength(), + pts, m_aBuf); + } else { + if (pts) { + aPts = pts; + m_aDecoder.DecodeAc3Dts(pesFrame.GetPesStart(), + pesFrame.GetPayload(), + pesFrame.GetPayloadLength(), + pts, m_aBuf); + + if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED) { + m_synchState = DXR3_DEMUX_SYNCHED; + } else { + m_synchState = DXR3_DEMUX_AUDIO_SYNCHED; + } + if (m_synchState == DXR3_DEMUX_SYNCHED) { + if (!vPts) { + vPts = aPts; + } + if (aPts < vPts) { + pcr = aPts - PRE_BUFFER_LENGTH; + } else { + pcr = vPts - PRE_BUFFER_LENGTH; + } + m_dxr3Device.SetSysClock(pcr); + m_dxr3Device.SetPlayMode(); + m_dxr3Device.EnableVideo(); + m_dxr3Device.EnableAudio(); + m_vBuf.Start(); + m_aBuf.Start(); + } + } + } + + } + + if (pesFrame.IsValid()) { + pesFrame.ExtractNextFrame(pesFrame.GetNextStart(), + pesFrame.GetRemainingLength()); + } + } + + length -= pesFrame.GetRemainingLength(); + + //if (m_demuxMode == DXR3_DEMUX_TRICK_MODE) return origLength; + return length; + } catch (cDxr3PesFrame::ePesFrameError err) { + dsyslog("cDxr3DemuxDevice::DemuxPes() ePesFrameError skipping data and resync"); + Resync(); + return origLength; + } catch (cDxr3SyncBuffer::eSyncBufferException err) { + Stop(); + return origLength; } } @@ -581,51 +517,44 @@ int cDxr3DemuxDevice::DemuxAudioPes(const uint8_t* buf, int length) try { - cDxr3PesFrame pesFrame; - - pesFrame.ExtractNextFrame(buf, length); - - while (pesFrame.IsValid()) - { - if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA) - { - if (m_synchState != DXR3_DEMUX_AUDIO_SYNCHED && - syncCounter > 2) - { - m_synchState = DXR3_DEMUX_AUDIO_SYNCHED; - m_dxr3Device.SetPlayMode(); - m_dxr3Device.EnableVideo(); - m_dxr3Device.EnableAudio(); - m_vBuf.Start(); - m_aBuf.Start(); - } - if (m_synchState != DXR3_DEMUX_AUDIO_SYNCHED && - syncCounter <= 2) - { - syncCounter++; - } - while (!m_aBuf.Poll(100)); - m_aDecoder.DecodeLpcm(pesFrame.GetPayload(), - pesFrame.GetPayloadLength(), 0, m_aBuf); - - } - - if (pesFrame.IsValid()) - { - pesFrame.ExtractNextFrame(pesFrame.GetNextStart(), - pesFrame.GetRemainingLength()); - } - } - - length -= pesFrame.GetRemainingLength(); - - return length; - } - catch (cDxr3PesFrame::ePesFrameError err) - { - dsyslog("cDxr3DemuxDevice::DemuxAudioPes() ePesFrameError skipping data and resync"); - Stop(); - return origLength; + cDxr3PesFrame pesFrame; + + pesFrame.ExtractNextFrame(buf, length); + + while (pesFrame.IsValid()) { + if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA) { + if (m_synchState != DXR3_DEMUX_AUDIO_SYNCHED && + syncCounter > 2) { + m_synchState = DXR3_DEMUX_AUDIO_SYNCHED; + m_dxr3Device.SetPlayMode(); + m_dxr3Device.EnableVideo(); + m_dxr3Device.EnableAudio(); + m_vBuf.Start(); + m_aBuf.Start(); + } + if (m_synchState != DXR3_DEMUX_AUDIO_SYNCHED && + syncCounter <= 2) { + syncCounter++; + } + while (!m_aBuf.Poll(100)); + m_aDecoder.DecodeLpcm(pesFrame.GetPayload(), + pesFrame.GetPayloadLength(), 0, m_aBuf); + + } + + if (pesFrame.IsValid()) { + pesFrame.ExtractNextFrame(pesFrame.GetNextStart(), + pesFrame.GetRemainingLength()); + } + } + + length -= pesFrame.GetRemainingLength(); + + return length; + } catch (cDxr3PesFrame::ePesFrameError err) { + dsyslog("cDxr3DemuxDevice::DemuxAudioPes() ePesFrameError skipping data and resync"); + Stop(); + return origLength; } } |