From ddcb536d06edd11f3e3b03b4bbd16baddb9b8c61 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Wed, 7 Jan 2009 16:17:04 +0100 Subject: rename dxr3outputthread --- dxr3output.c | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++++ dxr3output.h | 101 +++++++++++++++++++++++++ dxr3outputthread.c | 214 ----------------------------------------------------- dxr3outputthread.h | 101 ------------------------- 4 files changed, 315 insertions(+), 315 deletions(-) create mode 100644 dxr3output.c create mode 100644 dxr3output.h delete mode 100644 dxr3outputthread.c delete mode 100644 dxr3outputthread.h diff --git a/dxr3output.c b/dxr3output.c new file mode 100644 index 0000000..1be69d3 --- /dev/null +++ b/dxr3output.c @@ -0,0 +1,214 @@ +/* + * dxr3outputthread.c + * + * Copyright (C) 2002-2004 Kai Möller + * + * This program 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 program 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 General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include +#include "dxr3outputthread.h" + +// ================================== +const int AUDIO_OFFSET = 4500; +#define SCR m_dxr3Device.GetSysClock() +// ================================== + +// ================================== +//! constructor +cDxr3OutputThread::cDxr3OutputThread(cDxr3Interface& dxr3Device, + cDxr3SyncBuffer& buffer) : + cThread(), + m_dxr3Device(dxr3Device), + m_buffer(buffer), + m_bNeedResync(false) +{ +} + +// ================================== +//! constr. +cDxr3AudioOutThread::cDxr3AudioOutThread(cDxr3Interface& dxr3Device, + cDxr3SyncBuffer& buffer) : + cDxr3OutputThread(dxr3Device, buffer) +{ + SetDescription("DXR3 audio output"); +} + +//! destructor +cDxr3AudioOutThread::~cDxr3AudioOutThread() +{ + m_buffer.Stop(); + Cancel(3); +} + +// ================================== +//! thread action +void cDxr3AudioOutThread::Action() +{ + bool resync = false; + uint32_t pts = 0; + + while (Running()) + { + pts = 0; + cFixedLengthFrame* pNext = m_buffer.Get(); + + if (pNext) pts = pNext->GetPts(); + + if (pts && abs((int)pts-(int)SCR) > 30000 || + m_dxr3Device.IsExternalReleased()) + { + m_buffer.Clear(); + m_bNeedResync = true; + } + else if (pNext) + { + if (!pts || pts < SCR) + { + if (!pts && resync) + { + continue; + } + else + { + resync = false; + } + + if (pts && (pts < SCR) && ((SCR - pts) > 5000)) + { + m_dxr3Device.SetSysClock(pts + 1 * AUDIO_OFFSET); + m_dxr3Device.PlayAudioFrame(pNext); + if (m_buffer.IsPolled()) + { + m_buffer.Clear(); + m_bNeedResync = true; + } + } + else + { + m_dxr3Device.PlayAudioFrame(pNext); + m_buffer.Pop(); + } + } + else + { + if (abs((int)pts - (int)SCR) < (AUDIO_OFFSET )) + { + m_dxr3Device.PlayAudioFrame(pNext); + m_buffer.Pop(); + } + } + } + + if ((pts > SCR && abs((int)pts - (int)SCR) > AUDIO_OFFSET)) + { + cCondWait::SleepMs(10); + } + } +} + +// ================================== +//! constr. +cDxr3VideoOutThread::cDxr3VideoOutThread(cDxr3Interface& dxr3Device, + cDxr3SyncBuffer& buffer) : + cDxr3OutputThread(dxr3Device, buffer) +{ + SetDescription("DXR3 video output"); +} + +//! destructor +cDxr3VideoOutThread::~cDxr3VideoOutThread() +{ + m_buffer.Stop(); + Cancel(3); +} + +// ================================== +//! thread action +void cDxr3VideoOutThread::Action() +{ + uint32_t pts = 0; + static uint32_t lastPts = 0; + + while (Running()) + { + cFixedLengthFrame* pNext = m_buffer.Get(); + if (pNext) + { + pts = pNext->GetPts(); + if (pts == lastPts) + pts = 0; + + if (pts > SCR && abs((int)pts - (int)SCR) < 7500) + { + m_dxr3Device.SetPts(pts); + } + + if (!pts || pts < SCR) + { + if (m_buffer.Available()) + { + m_dxr3Device.PlayVideoFrame(pNext); + m_buffer.Pop(); + } + } + else + { + if ((pts > SCR) && abs((int)pts - (int)SCR) < 7500) + { + m_dxr3Device.SetPts(pts); + + if (m_buffer.Available() && pNext->GetData() && + pNext->GetCount()) + { + m_dxr3Device.PlayVideoFrame(pNext); + m_buffer.Pop(); + } + } + else + { + if (pts < SCR) + { + m_dxr3Device.PlayVideoFrame(pNext); + m_buffer.Pop(); + } + } + } + + + if (m_dxr3Device.IsExternalReleased()) + { + m_bNeedResync = true; + m_buffer.Clear(); + } + + if ((pts > SCR && abs((int)pts - (int)SCR) > 7500 )) + { + cCondWait::SleepMs(10); + } + } + } +} + +#undef SCR + +// Local variables: +// mode: c++ +// c-file-style: "stroustrup" +// c-file-offsets: ((inline-open . 0)) +// indent-tabs-mode: t +// End: diff --git a/dxr3output.h b/dxr3output.h new file mode 100644 index 0000000..e015daa --- /dev/null +++ b/dxr3output.h @@ -0,0 +1,101 @@ +/* + * dxr3outputthread.h + * + * Copyright (C) 2002-2004 Kai Möller + * + * This program 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 program 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 General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifndef _DXR3OUTPUTTHREAD_H_ +#define _DXR3OUTPUTTHREAD_H_ + +#include "dxr3vdrincludes.h" +#include "dxr3syncbuffer.h" +#include "dxr3audiodecoder.h" + +// ================================== +class cDxr3OutputThread : public cThread +{ +public: + cDxr3OutputThread(cDxr3Interface& dxr3Device, cDxr3SyncBuffer& buffer); + virtual ~cDxr3OutputThread() + { + Cancel(); + }; + /* + virtual void Start(void) + { + cThread::Start(); + }; + */ + bool NeedResync() + { + return m_bNeedResync; + }; + void ClearResyncRequest() + { + m_bNeedResync = false; + }; + +protected: + virtual void Action() = 0; + + cDxr3Interface& m_dxr3Device; + cDxr3SyncBuffer& m_buffer; + bool m_bNeedResync; + +private: + cDxr3OutputThread(cDxr3OutputThread&); // no copy constructor +}; + +// ================================== +class cDxr3AudioOutThread : public cDxr3OutputThread +{ +public: + cDxr3AudioOutThread(cDxr3Interface& dxr3Device, cDxr3SyncBuffer& buffer); + virtual ~cDxr3AudioOutThread(); + +protected: + void Action(); + +private: + //cDxr3AudioOutThread(); // no standard constructor + cDxr3AudioOutThread(cDxr3AudioOutThread&); // no copy constructor +}; + +// ================================== +class cDxr3VideoOutThread : public cDxr3OutputThread +{ +public: + cDxr3VideoOutThread(cDxr3Interface& dxr3Device, cDxr3SyncBuffer& buffer); + virtual ~cDxr3VideoOutThread(); + +protected: + void Action(); + +private: + //cDxr3VideoOutThread(); // no standard constructor + cDxr3VideoOutThread(cDxr3VideoOutThread&); // no copy constructor +}; + +#endif /*_DXR3OUTPUTTHREAD_H_*/ + +// Local variables: +// mode: c++ +// c-file-style: "stroustrup" +// c-file-offsets: ((inline-open . 0)) +// indent-tabs-mode: t +// End: diff --git a/dxr3outputthread.c b/dxr3outputthread.c deleted file mode 100644 index 1be69d3..0000000 --- a/dxr3outputthread.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * dxr3outputthread.c - * - * Copyright (C) 2002-2004 Kai Möller - * - * This program 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 program 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 General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include -#include -#include "dxr3outputthread.h" - -// ================================== -const int AUDIO_OFFSET = 4500; -#define SCR m_dxr3Device.GetSysClock() -// ================================== - -// ================================== -//! constructor -cDxr3OutputThread::cDxr3OutputThread(cDxr3Interface& dxr3Device, - cDxr3SyncBuffer& buffer) : - cThread(), - m_dxr3Device(dxr3Device), - m_buffer(buffer), - m_bNeedResync(false) -{ -} - -// ================================== -//! constr. -cDxr3AudioOutThread::cDxr3AudioOutThread(cDxr3Interface& dxr3Device, - cDxr3SyncBuffer& buffer) : - cDxr3OutputThread(dxr3Device, buffer) -{ - SetDescription("DXR3 audio output"); -} - -//! destructor -cDxr3AudioOutThread::~cDxr3AudioOutThread() -{ - m_buffer.Stop(); - Cancel(3); -} - -// ================================== -//! thread action -void cDxr3AudioOutThread::Action() -{ - bool resync = false; - uint32_t pts = 0; - - while (Running()) - { - pts = 0; - cFixedLengthFrame* pNext = m_buffer.Get(); - - if (pNext) pts = pNext->GetPts(); - - if (pts && abs((int)pts-(int)SCR) > 30000 || - m_dxr3Device.IsExternalReleased()) - { - m_buffer.Clear(); - m_bNeedResync = true; - } - else if (pNext) - { - if (!pts || pts < SCR) - { - if (!pts && resync) - { - continue; - } - else - { - resync = false; - } - - if (pts && (pts < SCR) && ((SCR - pts) > 5000)) - { - m_dxr3Device.SetSysClock(pts + 1 * AUDIO_OFFSET); - m_dxr3Device.PlayAudioFrame(pNext); - if (m_buffer.IsPolled()) - { - m_buffer.Clear(); - m_bNeedResync = true; - } - } - else - { - m_dxr3Device.PlayAudioFrame(pNext); - m_buffer.Pop(); - } - } - else - { - if (abs((int)pts - (int)SCR) < (AUDIO_OFFSET )) - { - m_dxr3Device.PlayAudioFrame(pNext); - m_buffer.Pop(); - } - } - } - - if ((pts > SCR && abs((int)pts - (int)SCR) > AUDIO_OFFSET)) - { - cCondWait::SleepMs(10); - } - } -} - -// ================================== -//! constr. -cDxr3VideoOutThread::cDxr3VideoOutThread(cDxr3Interface& dxr3Device, - cDxr3SyncBuffer& buffer) : - cDxr3OutputThread(dxr3Device, buffer) -{ - SetDescription("DXR3 video output"); -} - -//! destructor -cDxr3VideoOutThread::~cDxr3VideoOutThread() -{ - m_buffer.Stop(); - Cancel(3); -} - -// ================================== -//! thread action -void cDxr3VideoOutThread::Action() -{ - uint32_t pts = 0; - static uint32_t lastPts = 0; - - while (Running()) - { - cFixedLengthFrame* pNext = m_buffer.Get(); - if (pNext) - { - pts = pNext->GetPts(); - if (pts == lastPts) - pts = 0; - - if (pts > SCR && abs((int)pts - (int)SCR) < 7500) - { - m_dxr3Device.SetPts(pts); - } - - if (!pts || pts < SCR) - { - if (m_buffer.Available()) - { - m_dxr3Device.PlayVideoFrame(pNext); - m_buffer.Pop(); - } - } - else - { - if ((pts > SCR) && abs((int)pts - (int)SCR) < 7500) - { - m_dxr3Device.SetPts(pts); - - if (m_buffer.Available() && pNext->GetData() && - pNext->GetCount()) - { - m_dxr3Device.PlayVideoFrame(pNext); - m_buffer.Pop(); - } - } - else - { - if (pts < SCR) - { - m_dxr3Device.PlayVideoFrame(pNext); - m_buffer.Pop(); - } - } - } - - - if (m_dxr3Device.IsExternalReleased()) - { - m_bNeedResync = true; - m_buffer.Clear(); - } - - if ((pts > SCR && abs((int)pts - (int)SCR) > 7500 )) - { - cCondWait::SleepMs(10); - } - } - } -} - -#undef SCR - -// Local variables: -// mode: c++ -// c-file-style: "stroustrup" -// c-file-offsets: ((inline-open . 0)) -// indent-tabs-mode: t -// End: diff --git a/dxr3outputthread.h b/dxr3outputthread.h deleted file mode 100644 index e015daa..0000000 --- a/dxr3outputthread.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * dxr3outputthread.h - * - * Copyright (C) 2002-2004 Kai Möller - * - * This program 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 program 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 General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef _DXR3OUTPUTTHREAD_H_ -#define _DXR3OUTPUTTHREAD_H_ - -#include "dxr3vdrincludes.h" -#include "dxr3syncbuffer.h" -#include "dxr3audiodecoder.h" - -// ================================== -class cDxr3OutputThread : public cThread -{ -public: - cDxr3OutputThread(cDxr3Interface& dxr3Device, cDxr3SyncBuffer& buffer); - virtual ~cDxr3OutputThread() - { - Cancel(); - }; - /* - virtual void Start(void) - { - cThread::Start(); - }; - */ - bool NeedResync() - { - return m_bNeedResync; - }; - void ClearResyncRequest() - { - m_bNeedResync = false; - }; - -protected: - virtual void Action() = 0; - - cDxr3Interface& m_dxr3Device; - cDxr3SyncBuffer& m_buffer; - bool m_bNeedResync; - -private: - cDxr3OutputThread(cDxr3OutputThread&); // no copy constructor -}; - -// ================================== -class cDxr3AudioOutThread : public cDxr3OutputThread -{ -public: - cDxr3AudioOutThread(cDxr3Interface& dxr3Device, cDxr3SyncBuffer& buffer); - virtual ~cDxr3AudioOutThread(); - -protected: - void Action(); - -private: - //cDxr3AudioOutThread(); // no standard constructor - cDxr3AudioOutThread(cDxr3AudioOutThread&); // no copy constructor -}; - -// ================================== -class cDxr3VideoOutThread : public cDxr3OutputThread -{ -public: - cDxr3VideoOutThread(cDxr3Interface& dxr3Device, cDxr3SyncBuffer& buffer); - virtual ~cDxr3VideoOutThread(); - -protected: - void Action(); - -private: - //cDxr3VideoOutThread(); // no standard constructor - cDxr3VideoOutThread(cDxr3VideoOutThread&); // no copy constructor -}; - -#endif /*_DXR3OUTPUTTHREAD_H_*/ - -// Local variables: -// mode: c++ -// c-file-style: "stroustrup" -// c-file-offsets: ((inline-open . 0)) -// indent-tabs-mode: t -// End: -- cgit v1.2.3