diff options
author | Christian Gmeiner <christian.gmeiner@gmail.com> | 2009-04-24 20:09:47 +0200 |
---|---|---|
committer | Christian Gmeiner <christian.gmeiner@gmail.com> | 2009-04-24 20:09:47 +0200 |
commit | cea0df05bccf30a16cc77ee6f35f97faea481b72 (patch) | |
tree | deb5544b85dd1b725cdd8239cc3e8205ab55e17c | |
parent | 8da7ec22f96ab2fff531cd92d608f937e70f3d32 (diff) | |
download | vdr-plugin-dxr3-cea0df05bccf30a16cc77ee6f35f97faea481b72.tar.gz vdr-plugin-dxr3-cea0df05bccf30a16cc77ee6f35f97faea481b72.tar.bz2 |
create cDxr3PesFrame on the heap
This commit is a small step into the right direction - use one
datastructe from parsing to playback and this datastructe will
be cDxr3PesFrame. One of the next things to do is to change the
syncbuffer to store cDxr3PesFrames :)
-rw-r--r-- | dxr3demuxdevice.c | 85 |
1 files changed, 44 insertions, 41 deletions
diff --git a/dxr3demuxdevice.c b/dxr3demuxdevice.c index 2b56843..f74504c 100644 --- a/dxr3demuxdevice.c +++ b/dxr3demuxdevice.c @@ -236,51 +236,51 @@ int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts) bPlaySuc = false; } - cDxr3PesFrame pesFrame; + cDxr3PesFrame *pesFrame = new cDxr3PesFrame(); - if (!pesFrame.parse(buf, length)) { + if (!pesFrame || !pesFrame->parse(buf, length)) { return -1; } /*TODO: add to pes parser if (pesFrame.GetPayloadLength() > (uint32_t) VIDEO_MAX_FRAME_SIZE) { throw (cDxr3PesFrame::PES_GENERAL_ERROR); };*/ - if (pesFrame.GetPts() != lastPts) { - pts = lastPts = pesFrame.GetPts(); + if (pesFrame->GetPts() != lastPts) { + pts = lastPts = pesFrame->GetPts(); } else { pts = 0; } - if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_VIDEO_DATA) { + if (pesFrame->GetPesDataType() == cDxr3PesFrame::PES_VIDEO_DATA) { /* - m_dxr3Device.PlayVideoFrame(pesFrame.GetEsStart(), - (int) (pesFrame.GetPayloadLength())); + m_dxr3Device.PlayVideoFrame(pesFrame->GetEsStart(), + (int) (pesFrame->GetPayloadLength())); */ if (m_demuxMode == DXR3_DEMUX_TRICK_MODE) { - switch (pesFrame.GetFrameType()) { + 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(), pesFrame.GetPayloadLength(), m_ReUseFrame); + m_dxr3Device.SetHorizontalSize(pesFrame->GetHorizontalSize()); + m_dxr3Device.SetVerticalSize(pesFrame->GetVerticalSize()); + m_dxr3Device.PlayVideoFrame(pesFrame->GetPayload(), pesFrame->GetPayloadLength(), m_ReUseFrame); break; case UNKNOWN_FRAME: dsyslog("dxr3: demux: unknown frame"); if (bPlaySuc) { - m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), pesFrame.GetPayloadLength(), m_ReUseFrame); + m_dxr3Device.PlayVideoFrame(pesFrame->GetPayload(), pesFrame->GetPayloadLength(), m_ReUseFrame); } break; default: dsyslog("dxr3: demux: default frame"); if (bPlaySuc) { - m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), pesFrame.GetPayloadLength(), m_ReUseFrame); + m_dxr3Device.PlayVideoFrame(pesFrame->GetPayload(), pesFrame->GetPayloadLength(), m_ReUseFrame); } bPlaySuc = false; @@ -288,20 +288,20 @@ int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts) } } else if (m_demuxMode == DXR3_DEMUX_VIDEO_ONLY_MODE) { - m_dxr3Device.PlayVideoFrame(pesFrame.GetPayload(), (int)(pesFrame.GetPayloadLength())); + 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()); + 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); + cFixedLengthFrame* pTempFrame = m_vBuf.Push(pesFrame->GetPayload(), (int) (pesFrame->GetPayloadLength()), pts, ftVideo); // TODO: rework me //if (!pTempFrame) /* Push Timeout */ // throw (cDxr3PesFrame::PES_GENERAL_ERROR); - pTempFrame->SetAspectRatio(pesFrame.GetAspectRatio()); + pTempFrame->SetAspectRatio(pesFrame->GetAspectRatio()); m_aBuf.WakeUp(); @@ -316,17 +316,17 @@ int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts) m_aBuf.Start(); } } else { - if (pesFrame.GetFrameType() == I_FRAME) { + 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); + m_dxr3Device.SetHorizontalSize(pesFrame->GetHorizontalSize()); + m_dxr3Device.SetVerticalSize(pesFrame->GetVerticalSize()); + cFixedLengthFrame* pTempFrame = m_vBuf.Push(pesFrame->GetPayload(), (int) (pesFrame->GetPayloadLength()), pts, ftVideo); // TODO: rework me //if (!pTempFrame) /* Push Timeout */ // throw (cDxr3PesFrame::PES_GENERAL_ERROR); - pTempFrame->SetAspectRatio(pesFrame.GetAspectRatio()); + pTempFrame->SetAspectRatio(pesFrame->GetAspectRatio()); if (m_synchState == DXR3_DEMUX_AUDIO_SYNCHED) { m_synchState = DXR3_DEMUX_SYNCHED; @@ -352,7 +352,7 @@ int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts) } } - } else if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_AUDIO_DATA + } 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 || @@ -368,13 +368,13 @@ int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts) m_aBuf.Start(); } while(!Poll(100)); - m_aDecoder.Decode(&pesFrame, pts, m_aBuf); + m_aDecoder.Decode(pesFrame, pts, m_aBuf); } else { if (pts) { aPts = pts; - m_aDecoder.Decode(&pesFrame, pts, m_aBuf); + m_aDecoder.Decode(pesFrame, pts, m_aBuf); if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED) { m_synchState = DXR3_DEMUX_SYNCHED; @@ -399,17 +399,17 @@ int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts) } } } - } else if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA + } 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, pts, m_aBuf); + m_aDecoder.DecodeLpcm(pesFrame, pts, m_aBuf); } else { if (pts) { aPts = pts; - m_aDecoder.DecodeLpcm(&pesFrame, pts, m_aBuf); + m_aDecoder.DecodeLpcm(pesFrame, pts, m_aBuf); if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED) { m_synchState = DXR3_DEMUX_SYNCHED; @@ -434,22 +434,22 @@ int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts) } } } - } else if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA + } 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(), + 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(), + m_aDecoder.DecodeAc3Dts(pesFrame->GetPesStart(), + pesFrame->GetPayload(), + pesFrame->GetPayloadLength(), pts, m_aBuf); if (m_synchState == DXR3_DEMUX_VIDEO_SYNCHED) { @@ -477,6 +477,8 @@ int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts) } } + delete pesFrame; + //if (m_demuxMode == DXR3_DEMUX_TRICK_MODE) return origLength; return length; } @@ -490,13 +492,13 @@ int cDxr3DemuxDevice::DemuxAudioPes(const uint8_t* buf, int length) m_aBuf.SetDemuxMode(DXR3_DEMUX_REPLAY_MODE); m_vBuf.SetDemuxMode(DXR3_DEMUX_REPLAY_MODE); - cDxr3PesFrame pesFrame; + cDxr3PesFrame *pesFrame = new cDxr3PesFrame(); - if (!pesFrame.parse(buf, length)) { + if (!pesFrame || !pesFrame->parse(buf, length)) { return -1; } - if (pesFrame.GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA) { + if (pesFrame->GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA) { if (m_synchState != DXR3_DEMUX_AUDIO_SYNCHED && syncCounter > 2) { m_synchState = DXR3_DEMUX_AUDIO_SYNCHED; @@ -511,10 +513,11 @@ int cDxr3DemuxDevice::DemuxAudioPes(const uint8_t* buf, int length) syncCounter++; } while (!m_aBuf.Poll(100)); - m_aDecoder.DecodeLpcm(&pesFrame, 0, m_aBuf); - + m_aDecoder.DecodeLpcm(pesFrame, 0, m_aBuf); } + delete pesFrame; + return length; } |