summaryrefslogtreecommitdiff
path: root/dxr3syncbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'dxr3syncbuffer.c')
-rw-r--r--dxr3syncbuffer.c294
1 files changed, 0 insertions, 294 deletions
diff --git a/dxr3syncbuffer.c b/dxr3syncbuffer.c
deleted file mode 100644
index d9b7f3d..0000000
--- a/dxr3syncbuffer.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * dxr3syncbuffer.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
- *
- */
-
-/*
- ToDo:
- - cDxr3SyncBuffer::Push: XXX This is only a workaround until a
- sufficient control algorithm is implemented
-*/
-
-#include <sys/time.h>
-#include "dxr3syncbuffer.h"
-
-const int DXR3_MAX_VIDEO_FRAME_LENGTH = 4096;
-const int DXR3_MAX_AUDIO_FRAME_LENGTH = 4096;
-
-// ==================================
-cFixedLengthFrame::~cFixedLengthFrame()
-{
- if (m_pData) {
- delete[] m_pData;
- }
-}
-
-// ==================================
-// ! setup our frame
-void cFixedLengthFrame::Init(uint32_t length)
-{
- this->length = length;
- m_pData = new uint8_t[length];
-
- // allocation ok?
- if (!m_pData) {
- esyslog("dxr3: fatal: unable to allocate memory for new frame");
- exit(1);
- }
-}
-
-// ==================================
-void cFixedLengthFrame::CopyFrame(const uint8_t* pStart, int length)
-{
- if (length > this->length()) {
- delete[] m_pData;
- m_pData = new uint8_t[length];
- }
- this->length = length;
- memcpy((void*) m_pData, (void*) pStart, length);
-}
-
-// ==================================
-uint8_t* cFixedLengthFrame::GetData(void)
-{
- return m_pData;
-}
-
-// ==================================
-//! constructor
-cDxr3SyncBuffer::cDxr3SyncBuffer(int frameCount, int frameLength) :
- cRingBuffer(frameCount, true)
-{
- m_dxr3Device = cDxr3Interface::instance();
- m_pBuffer = new cFixedLengthFrame[frameCount];
-
- // got we a valid m_pBuffer?
- if (!m_pBuffer) {
- esyslog("dxr3: fatal: unable to allocate memory for new frame");
- exit(1);
- }
-
- // init our new m_pBuffer;
- for (int i = 0; i < frameCount; i++) {
- m_pBuffer[i].Init(frameLength);
- }
-
- // set some default values
- m_count = 0;
- m_nextFree = 0;
- m_next = 0;
- m_bPutBlock = false;
- m_bGetBlock = false;
- m_bStartReceiver = false;
- m_bStopped = false;
- m_demuxMode = DXR3_DEMUX_TV_MODE;
- m_bPollSync = false;
- SetTimeouts(1000, 10);
-}
-
-// ==================================
-cDxr3SyncBuffer::~cDxr3SyncBuffer()
-{
- if (m_pBuffer) {
- delete[] m_pBuffer;
- }
-}
-
-// ==================================
-int cDxr3SyncBuffer::Available(void)
-{
- return m_count;
-}
-
-// ==================================
-const int BUFFER_LIMIT = 5;
-const int BUFFER_LIMIT_2 = 10;
-
-// ==================================
-bool cDxr3SyncBuffer::Poll(int TimeoutMs)
-{
- bool retVal = true;
- uint32_t currTime = m_dxr3Device->GetSysClock();
- struct timeval tv_start, tv;
- m_bPollSync = true;
- gettimeofday(&tv_start, NULL);
- if (m_demuxMode == DXR3_DEMUX_REPLAY_MODE) {
- if (Available() >= Size() - (Size()*BUFFER_LIMIT/100)) {
- m_bPollSync = true;
- while ((Available() >= Size() - (Size()*BUFFER_LIMIT_2)/100) &&
- ((m_dxr3Device->GetSysClock() - currTime) <
- ((uint32_t)TimeoutMs * (uint32_t)45)))
- {
- int d_s, d_us, ms;
- m_bPutBlock = true;
- EnableGet();
- WaitForPut();
- gettimeofday(&tv, NULL);
- d_s = tv.tv_sec - tv_start.tv_sec;
- d_us = tv.tv_usec - tv_start.tv_usec;
- ms = d_s * 1000 + d_us / 1000;
- if (ms > TimeoutMs * 2) {
- esyslog("dxr3: sync: secondary timeout");
- break;
- }
- }
- if (Available() >= Size() - (Size()*BUFFER_LIMIT_2)/100) {
- retVal = false;
- }
- }
- }
-
- return retVal;
-}
-
-// ==================================
-cFixedLengthFrame* cDxr3SyncBuffer::Push(const uint8_t* pStart, int length, uint32_t pts) throw (eSyncBufferException)
-{
- int lastIndex = 0;
- struct timeval tv_start, tv;
- gettimeofday(&tv_start, NULL);
-
- while ((Available() >= Size() - (Size()*10)/100)) {
- int d_s, d_us, ms;
- m_bPutBlock = true;
- EnableGet();
- WaitForPut();
- gettimeofday(&tv, NULL);
- d_s = tv.tv_sec - tv_start.tv_sec;
- d_us = tv.tv_usec - tv_start.tv_usec;
- ms = d_s * 1000 + d_us / 1000;
- if (ms > 2000) {
- esyslog("dxr3: sync: push timeout");
- return NULL;
- }
- }
-
- lastIndex = m_nextFree;
- m_pBuffer[m_nextFree].CopyFrame(pStart, length);
- m_pBuffer[m_nextFree].pts(pts);
- m_pBuffer[m_nextFree].channels(UNKNOWN_CHANNEL_COUNT);
- m_pBuffer[m_nextFree].samplerate(UNKNOWN_DATA_RATE);
- m_pBuffer[m_nextFree].aspectratio(UNKNOWN_ASPECT_RATIO);
- m_nextFree++;
- m_count++;
- m_nextFree %= Size();
-
- if (m_nextFree == m_next) {
- esyslog("dxr3: sync: push buffer overrun");
- Clear(); // XXX This is only a workaround until a sufficient control algorithm is implemented
- throw(SYNC_BUFFER_OVERRUN);
- }
- if (m_bStartReceiver) {
- EnableGet();
- }
-
- return &m_pBuffer[lastIndex];
-}
-
-// ==================================
-void cDxr3SyncBuffer::Pop(void)
-{
- if (m_count) {
- m_next++;
- m_count--;
- m_next %= Size();
- if (m_next == m_nextFree) {
- m_next = m_nextFree = m_count = 0;
- }
- }
- EnablePut();
-}
-
-// ==================================
-cFixedLengthFrame* cDxr3SyncBuffer::Get(void)
-{
- cFixedLengthFrame* pRet = 0;
-
- if (!m_bStopped) {
- while ((!Available() || !m_bStartReceiver) && !m_bStopped) {
- m_bGetBlock = true;
- ReceiverStopped();
- WaitForGet();
- }
-
- if (m_nextFree != m_next) {
- pRet = &m_pBuffer[m_next];
- }
- } else {
- WaitForGet();
- }
-
- return pRet;
-}
-
-// ==================================
-void cDxr3SyncBuffer::Clear(void)
-{
- m_next = 0;
- m_nextFree = 0;
- m_count = 0;
- m_bStartReceiver = false;
- m_bPollSync = false;
- if (m_bPutBlock) {
- EnablePut();
- m_bPutBlock = false;
- }
-}
-
-// ==================================
-void cDxr3SyncBuffer::Start(void)
-{
- m_bStartReceiver = true;
- m_bStopped = false;
- if (Available()) {
- EnableGet();
- }
-}
-
-// ==================================
-void cDxr3SyncBuffer::WakeUp(void)
-{
- if (m_bStartReceiver == true) {
- EnableGet();
- }
-}
-
-// ==================================
-void cDxr3SyncBuffer::WaitForReceiverStopped(void)
-{
- if (!m_bGetBlock) {
- receiverStoppedMutex.Lock();
- receiverStopped.Wait(receiverStoppedMutex);
- receiverStoppedMutex.Unlock();
- }
-}
-
-// ==================================
-void cDxr3SyncBuffer::ReceiverStopped(void)
-{
- receiverStopped.Broadcast();
-}
-
-// Local variables:
-// mode: c++
-// c-file-style: "stroustrup"
-// c-file-offsets: ((inline-open . 0))
-// tab-width: 4;
-// indent-tabs-mode: nil
-// End: