summaryrefslogtreecommitdiff
path: root/dxr3demuxdevice.c
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2010-02-02 15:26:59 +0100
committerChristian Gmeiner <christian.gmeiner@gmail.com>2010-02-02 15:26:59 +0100
commit009b7d2a7e16c0485d655f28a8a3594f2838a02f (patch)
treeb618080c194e1b6084994eb3efbb58600a2d3e01 /dxr3demuxdevice.c
parentd1ae16e9c46724dfe3be488a81e5cff3084ded99 (diff)
downloadvdr-plugin-dxr3-009b7d2a7e16c0485d655f28a8a3594f2838a02f.tar.gz
vdr-plugin-dxr3-009b7d2a7e16c0485d655f28a8a3594f2838a02f.tar.bz2
remove old buffer and a/v sync parts
Diffstat (limited to 'dxr3demuxdevice.c')
-rw-r--r--dxr3demuxdevice.c416
1 files changed, 0 insertions, 416 deletions
diff --git a/dxr3demuxdevice.c b/dxr3demuxdevice.c
deleted file mode 100644
index 0814488..0000000
--- a/dxr3demuxdevice.c
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- * dxr3demuxdevice.c
- *
- * Copyright (C) 2002-2004 Kai Möller
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#include "dxr3demuxdevice.h"
-#include "dxr3pesframe.h"
-
-// ==================================
-//! constructor
-cDxr3DemuxDevice::cDxr3DemuxDevice() :
- aBuf(AUDIO_MAX_BUFFER_SIZE, AUIDO_MAX_FRAME_SIZE),
- vBuf(VIDEO_MAX_BUFFER_SIZE, VIDEO_MAX_FRAME_SIZE)
-{
- synchState = DXR3_DEMUX_UNSYNCHED;
- demuxMode = DXR3_DEMUX_OFF_MODE;
- audioThread = new cDxr3AudioOutThread(aBuf);
- if (!audioThread) {
- esyslog("dxr3: fatal: unable to allocate memory for audio thread");
- exit(1);
- }
-
- videoThread = new cDxr3VideoOutThread(vBuf);
- if (!videoThread) {
- esyslog("dxr3: fatal: unable to allocate memory for video thread");
- exit(1);
- }
- videoThread->Start();
-}
-
-void cDxr3DemuxDevice::setAudio(iAudio *audio)
-{
- audioThread->setAudio(audio);
- audioThread->Start();
-}
-
-// ==================================
-// deconstr.
-cDxr3DemuxDevice::~cDxr3DemuxDevice()
-{
- delete videoThread;
- delete audioThread;
-}
-
-// ==================================
-// stop demuxing process
-void cDxr3DemuxDevice::Stop()
-{
- cDxr3Interface::instance()->DisableVideo();
- audioThread->audio()->setEnabled(false);
- vBuf.Clear();
- aBuf.Clear();
- vBuf.WakeUp();
- aBuf.WakeUp();
- vBuf.WaitForReceiverStopped();
- aBuf.WaitForReceiverStopped();
- synchState = DXR3_DEMUX_UNSYNCHED;
- demuxMode = DXR3_DEMUX_OFF_MODE;
-
- cDxr3Interface::instance()->PlayBlackFrame();
-}
-
-// ==================================
-void cDxr3DemuxDevice::Resync()
-{
- cDxr3Interface::instance()->DisableVideo();
- audioThread->audio()->setEnabled(false);
- vBuf.Clear();
- aBuf.Clear();
- vBuf.WakeUp();
- aBuf.WakeUp();
- vBuf.WaitForReceiverStopped();
- aBuf.WaitForReceiverStopped();
- synchState = DXR3_DEMUX_UNSYNCHED;
- demuxMode = DXR3_DEMUX_OFF_MODE;
-}
-
-// ==================================
-void cDxr3DemuxDevice::Clear()
-{
- cDxr3Interface::instance()->DisableVideo();
- audioThread->audio()->setEnabled(false);
- vBuf.Clear();
- aBuf.Clear();
- vBuf.WakeUp();
- aBuf.WakeUp();
- vBuf.WaitForReceiverStopped();
- aBuf.WaitForReceiverStopped();
- synchState = DXR3_DEMUX_UNSYNCHED;
- demuxMode = DXR3_DEMUX_OFF_MODE;
-}
-
-// ==================================
-void cDxr3DemuxDevice::SetReplayMode()
-{
- if (demuxMode != DXR3_DEMUX_REPLAY_MODE)
- {
- if (demuxMode == DXR3_DEMUX_TRICK_MODE && trickState == DXR3_FREEZE) {
- cDxr3Interface::instance()->SetPlayMode();
- cDxr3Interface::instance()->SetSysClock(stopScr);
- cDxr3Interface::instance()->EnableVideo();
- audioThread->audio()->setEnabled(true);
- vBuf.Start();
- aBuf.Start();
- vBuf.WakeUp();
- aBuf.WakeUp();
- } else {
- synchState = DXR3_DEMUX_UNSYNCHED;
- aBuf.SetDemuxMode(DXR3_DEMUX_REPLAY_MODE);
- vBuf.SetDemuxMode(DXR3_DEMUX_REPLAY_MODE);
- }
- }
- demuxMode = DXR3_DEMUX_REPLAY_MODE;
-}
-
-// ==================================
-void cDxr3DemuxDevice::SetTrickMode(eDxr3TrickState trickState, int Speed)
-{
- demuxMode = DXR3_DEMUX_TRICK_MODE;
- trickState = trickState;
- audioThread->audio()->setEnabled(false);
-
- if (demuxMode == DXR3_DEMUX_TRICK_MODE && trickState == DXR3_FREEZE) {
- stopScr = cDxr3Interface::instance()->GetSysClock();
- // cDxr3Interface::instance()->Pause();
- vBuf.Stop();
- aBuf.Stop();
- } else {
- vBuf.Clear();
- aBuf.Clear();
- }
-}
-
-// ==================================
-void cDxr3DemuxDevice::StillPicture()
-{
- vBuf.Clear();
- aBuf.Clear();
- demuxMode = DXR3_DEMUX_TRICK_MODE;
- trickState = DXR3_FREEZE;
-}
-
-// ==================================
-int cDxr3DemuxDevice::DemuxPes(const uint8_t* buf, int length, bool bAc3Dts)
-{
- uint32_t pts = 0;
- static uint32_t aPts = 0;
- static uint32_t vPts = 0;
- static uint32_t lastPts = 0;
- static bool bPlaySuc = false;
- static bool bPlayedFrame = false;
-
- int scr = 0;
- int pcr = 0;
-
- scr = cDxr3Interface::instance()->GetSysClock();
-
- if (audioThread->NeedResync() || videoThread->NeedResync()) {
- Resync();
- if (demuxMode == DXR3_DEMUX_REPLAY_MODE) {
- SetReplayMode();
- }
- aBuf.Clear();
- vBuf.Clear();
- audioThread->ClearResyncRequest();
- videoThread->ClearResyncRequest();
- aDecoder.Reset();
- lastPts = 0;
- aPts = 0;
- vPts = 0;
- bPlaySuc = false;
- }
-
- if (demuxMode == DXR3_DEMUX_OFF_MODE) {
- demuxMode = DXR3_DEMUX_TV_MODE;
- synchState = DXR3_DEMUX_UNSYNCHED;
-
- lastPts = 0;
- aPts = 0;
- vPts = 0;
- bPlaySuc = false;
- }
-
- cDxr3PesFrame *pesFrame = new cDxr3PesFrame();
-
- if (!pesFrame || !pesFrame->parse(buf, length)) {
- return -1;
- }
-
- if (pesFrame->GetPts() != lastPts) {
- pts = lastPts = pesFrame->GetPts();
- } else {
- pts = 0;
- }
-
- if (demuxMode != DXR3_DEMUX_VIDEO_ONLY_MODE) {
-
- if (pesFrame->GetPesDataType() != cDxr3PesFrame::PES_VIDEO_DATA) {
-
- if (synchState == DXR3_DEMUX_AUDIO_SYNCHED || synchState == DXR3_DEMUX_SYNCHED) {
- if (pts && synchState != DXR3_DEMUX_SYNCHED) {
- synchState = DXR3_DEMUX_SYNCHED;
- pcr = aPts - PRE_BUFFER_LENGTH;
- cDxr3Interface::instance()->SetSysClock(pcr);
- cDxr3Interface::instance()->SetPlayMode();
- cDxr3Interface::instance()->EnableVideo();
- audioThread->audio()->setEnabled(true);
- vBuf.Start();
- aBuf.Start();
- }
- while(!Poll(100)) {}
-
- if (pesFrame->GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA) {
- if (bAc3Dts) {
- aDecoder.DecodeAc3Dts(pesFrame, pts, aBuf);
- } else {
- aDecoder.DecodeLpcm(pesFrame, pts, aBuf);
- }
- }
- aDecoder.Decode(pesFrame, pts, aBuf);
-
- } else {
- if (pts) {
- aPts = pts;
-
- if (pesFrame->GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA) {
- if (bAc3Dts) {
- aDecoder.DecodeAc3Dts(pesFrame, pts, aBuf);
- } else {
- aDecoder.DecodeLpcm(pesFrame, pts, aBuf);
- }
- }
- aDecoder.Decode(pesFrame, pts, aBuf);
-
- if (synchState == DXR3_DEMUX_VIDEO_SYNCHED) {
- synchState = DXR3_DEMUX_SYNCHED;
- } else {
- synchState = DXR3_DEMUX_AUDIO_SYNCHED;
- }
- if (synchState == DXR3_DEMUX_SYNCHED) {
- if (!vPts) {
- vPts = aPts;
- }
- if (aPts < vPts) {
- pcr = aPts - PRE_BUFFER_LENGTH;
- } else {
- pcr = vPts - PRE_BUFFER_LENGTH;
- }
- cDxr3Interface::instance()->SetSysClock(pcr);
- cDxr3Interface::instance()->SetPlayMode();
- cDxr3Interface::instance()->EnableVideo();
- audioThread->audio()->setEnabled(true);
- vBuf.Start();
- aBuf.Start();
- }
- }
- }
- } else {
-
- if (demuxMode == DXR3_DEMUX_TRICK_MODE) {
- switch (pesFrame->GetFrameType()) {
- case I_FRAME:
- dsyslog("dxr3: demux: I-frame");
- bPlaySuc = true;
- //if (bPlayedFrame) return length;
- bPlayedFrame = true;
- cDxr3Interface::instance()->setDimension(pesFrame->GetHorizontalSize(), pesFrame->GetVerticalSize());
- cDxr3Interface::instance()->PlayVideoFrame(pesFrame);
- break;
-
- case UNKNOWN_FRAME:
- dsyslog("dxr3: demux: unknown frame");
- if (bPlaySuc) {
- cDxr3Interface::instance()->PlayVideoFrame(pesFrame);
- }
- break;
-
- default:
- dsyslog("dxr3: demux: default frame");
- if (bPlaySuc) {
- cDxr3Interface::instance()->PlayVideoFrame(pesFrame);
- }
-
- bPlaySuc = false;
- break;
- }
-
- } else if (synchState == DXR3_DEMUX_VIDEO_SYNCHED || synchState == DXR3_DEMUX_SYNCHED) {
- cDxr3Interface::instance()->setDimension(pesFrame->GetHorizontalSize(), pesFrame->GetVerticalSize());
- while (!Poll(100)) {}
- cFixedLengthFrame* pTempFrame = vBuf.Push(pesFrame->GetPayload(), (int) (pesFrame->GetPayloadLength()), pts);
-
- // TODO: rework me
- //if (!pTempFrame) /* Push Timeout */
- // throw (cDxr3PesFrame::PES_GENERAL_ERROR);
-
- pTempFrame->aspectratio(pesFrame->GetAspectRatio());
-
- aBuf.WakeUp();
-
- if (vBuf.GetFillLevel() > 5 && synchState != DXR3_DEMUX_SYNCHED) {
- synchState = DXR3_DEMUX_SYNCHED;
- pcr = vPts - PRE_BUFFER_LENGTH;
- cDxr3Interface::instance()->SetSysClock(pcr);
- cDxr3Interface::instance()->SetPlayMode();
- cDxr3Interface::instance()->EnableVideo();
- audioThread->audio()->setEnabled(true);
- vBuf.Start();
- aBuf.Start();
- }
- } else {
- if (pesFrame->GetFrameType() == I_FRAME) {
- vPts = pts;
-
- cDxr3Interface::instance()->setDimension(pesFrame->GetHorizontalSize(), pesFrame->GetVerticalSize());
- cFixedLengthFrame* pTempFrame = vBuf.Push(pesFrame->GetPayload(), (int) (pesFrame->GetPayloadLength()), pts);
- // TODO: rework me
- //if (!pTempFrame) /* Push Timeout */
- // throw (cDxr3PesFrame::PES_GENERAL_ERROR);
-
- pTempFrame->aspectratio(pesFrame->GetAspectRatio());
-
- if (synchState == DXR3_DEMUX_AUDIO_SYNCHED) {
- synchState = DXR3_DEMUX_SYNCHED;
- } else {
- synchState = DXR3_DEMUX_VIDEO_SYNCHED;
- }
- if (synchState == DXR3_DEMUX_SYNCHED) {
- if (!vPts) {
- vPts = aPts;
- }
- if (aPts < vPts) {
- pcr = aPts - PRE_BUFFER_LENGTH;
- } else {
- pcr = vPts - PRE_BUFFER_LENGTH;
- }
- cDxr3Interface::instance()->SetSysClock(pcr);
- cDxr3Interface::instance()->SetPlayMode();
- cDxr3Interface::instance()->EnableVideo();
- audioThread->audio()->setEnabled(true);
- vBuf.Start();
- aBuf.Start();
- }
- }
- }
-
- }
- } else if (demuxMode == DXR3_DEMUX_VIDEO_ONLY_MODE) {
- cDxr3Interface::instance()->PlayVideoFrame(pesFrame);
- }
-
- delete pesFrame;
- return length;
-}
-
-// ==================================
-int cDxr3DemuxDevice::DemuxAudioPes(const uint8_t* buf, int length)
-{
- static int syncCounter = 0;
-
- demuxMode = DXR3_DEMUX_AUDIO_ONLY_MODE;
- aBuf.SetDemuxMode(DXR3_DEMUX_REPLAY_MODE);
- vBuf.SetDemuxMode(DXR3_DEMUX_REPLAY_MODE);
-
- cDxr3PesFrame *pesFrame = new cDxr3PesFrame();
-
- if (!pesFrame || !pesFrame->parse(buf, length)) {
- return -1;
- }
-
- if (pesFrame->GetPesDataType() == cDxr3PesFrame::PES_PRIVATE_DATA) {
- if (synchState != DXR3_DEMUX_AUDIO_SYNCHED &&
- syncCounter > 2) {
- synchState = DXR3_DEMUX_AUDIO_SYNCHED;
- cDxr3Interface::instance()->SetPlayMode();
- cDxr3Interface::instance()->EnableVideo();
- audioThread->audio()->setEnabled(true);
- vBuf.Start();
- aBuf.Start();
- }
- if (synchState != DXR3_DEMUX_AUDIO_SYNCHED &&
- syncCounter <= 2) {
- syncCounter++;
- }
- while (!aBuf.Poll(100)) {}
- aDecoder.DecodeLpcm(pesFrame, 0, aBuf);
- }
-
- delete pesFrame;
-
- return length;
-}
-
-// Local variables:
-// mode: c++
-// c-file-style: "stroustrup"
-// c-file-offsets: ((inline-open . 0))
-// tab-width: 4;
-// indent-tabs-mode: nil
-// End: