summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/device.c19
-rw-r--r--common.c6
-rw-r--r--libdvbmpeg/cpptools.cc18
-rw-r--r--libdvbmpeg/remux.c2
-rw-r--r--remux/extern.c9
-rw-r--r--server/connectionVTP.c28
-rw-r--r--server/connectionVTP.h2
-rw-r--r--server/streamer.c4
-rw-r--r--tools/source.c4
9 files changed, 63 insertions, 29 deletions
diff --git a/client/device.c b/client/device.c
index be79bb9..7069c62 100644
--- a/client/device.c
+++ b/client/device.c
@@ -1,5 +1,5 @@
/*
- * $Id: device.c,v 1.13 2007/05/07 12:18:18 schmirl Exp $
+ * $Id: device.c,v 1.14 2007/07/20 06:46:47 schmirl Exp $
*/
#include "client/device.h"
@@ -51,12 +51,21 @@ cStreamdevDevice::cStreamdevDevice(void) {
cStreamdevDevice::~cStreamdevDevice() {
Dprintf("Device gets destructed\n");
+
+ Lock();
m_Device = NULL;
- delete m_TSBuffer;
- delete m_Assembler;
+ m_Filters->SetConnection(-1);
+ ClientSocket.Quit();
+ ClientSocket.Reset();
+ Unlock();
+
+ Cancel(3);
+
#if VDRVERSNUM >= 10300
- delete m_Filters;
+ DELETENULL(m_Filters);
#endif
+ DELETENULL(m_TSBuffer);
+ delete m_Assembler;
}
bool cStreamdevDevice::ProvidesSource(int Source) const {
@@ -216,7 +225,7 @@ void cStreamdevDevice::CloseDvr(void) {
}
bool cStreamdevDevice::GetTSPacket(uchar *&Data) {
- if (m_TSBuffer) {
+ if (m_TSBuffer && m_Device) {
Data = m_TSBuffer->Get();
#if 1 // TODO: this should be fixed in vdr cTSBuffer
// simple disconnect detection
diff --git a/common.c b/common.c
index 34495c1..f422c5e 100644
--- a/common.c
+++ b/common.c
@@ -1,5 +1,5 @@
/*
- * $Id: common.c,v 1.4 2005/02/11 16:44:14 lordjaxom Exp $
+ * $Id: common.c,v 1.5 2007/09/21 11:55:56 schmirl Exp $
*/
#include <vdr/channels.h>
@@ -11,7 +11,7 @@
using namespace std;
-const char *VERSION = "0.3.3-20070509";
+const char *VERSION = "0.3.3-20070921";
const char *StreamTypes[st_Count] = {
"TS",
@@ -270,7 +270,7 @@ eOSState cMenuEditIpItem::ProcessKey(eKeys Key) {
} else
curNum = curNum * 10 + (Key - k0);
- if (!step && (curNum * 10 > 255) || (curNum == 0)) {
+ if ((curNum * 10 > 255) || (curNum == 0)) {
in_addr addr;
addr.s_addr = inet_addr(value);
if ((int)addr.s_addr == -1)
diff --git a/libdvbmpeg/cpptools.cc b/libdvbmpeg/cpptools.cc
index 91808cc..0cf514c 100644
--- a/libdvbmpeg/cpptools.cc
+++ b/libdvbmpeg/cpptools.cc
@@ -559,11 +559,12 @@ istream & operator >> (istream & stream, PS_Packet & x){
p = stream.tellg();
while (!stream.eof() && !found && count < MAX_SEARCH) {
stream.read((char *)&headr,4);
- if (headr[0] == 0x00 && headr[1] == 0x00 && headr[2] == 0x01)
+ if (headr[0] == 0x00 && headr[1] == 0x00 && headr[2] == 0x01) {
if ( headr[3] == 0xBA )
found = 1;
else if ( headr[3] == 0xB9 ) break;
else stream.seekg(p+streampos(1));
+ }
count++;
}
@@ -776,16 +777,16 @@ int tv_norm(istream &stream){
while (!stream.eof() && !found) {
p = stream.tellg();
stream.read((char *)headr,4);
- if (headr[0] == 0x00 && headr[1] == 0x00 && headr[2] == 0x01)
+ if (headr[0] == 0x00 && headr[1] == 0x00 && headr[2] == 0x01) {
if ( headr[3] == 0xB5 ){
- char *profile[] = {"reserved", "High", "Spatially Scalable",
+ const char *profile[] = {"reserved", "High", "Spatially Scalable",
"SNR Scalable", "Main", "Simple", "undef",
"undef"};
- char *level[] = {"res", "res", "res", "res",
+ const char *level[] = {"res", "res", "res", "res",
"High","res", "High 1440", "res",
"Main","res", "Low", "res",
"res", "res", "res", "res"};
- char *chroma[] = {"res", "4:2:0", "4:2:2", "4:4:4:"};
+ const char *chroma[] = {"res", "4:2:0", "4:2:2", "4:4:4:"};
mpeg = 2;
stream.read((char *)headr,4);
cerr << "PROFILE: " << profile[headr[0] & 0x7] << endl;
@@ -795,7 +796,8 @@ int tv_norm(istream &stream){
} else {
mpeg = 1;
found = 1;
- }
+ }
+ }
if (! found) stream.seekg(p+streampos(1));
}
@@ -831,7 +833,7 @@ int stream_type(istream &fin){
}
fin >> pes;
- fin.read((char *)!headr,4);
+ fin.read((char *)NULL,4);
fin.seekg(p);
if (fin && headr[0] == 0x00 && headr[1] == 0x00
&& headr[2] == 0x01 ){
@@ -868,7 +870,7 @@ void analyze(istream &fin)
PS_Packet ps;
PES_Packet pes;
int fc = 0;
- char *frames[3] = {"I-Frame","P-Frame","B-Frame"};
+ const char *frames[3] = {"I-Frame","P-Frame","B-Frame"};
while(fin){
uint32_t pts;
diff --git a/libdvbmpeg/remux.c b/libdvbmpeg/remux.c
index 6f8a44f..1d65525 100644
--- a/libdvbmpeg/remux.c
+++ b/libdvbmpeg/remux.c
@@ -489,7 +489,7 @@ int get_video_info(Remux *rem)
VideoInfo *vi = &rem->video_info;
while (found < 4 && ring_rest(vid_buffy)){
- uint8_t b[3];
+ uint8_t b[4];
vring_peek( rem, b, 4, 0);
if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01
diff --git a/remux/extern.c b/remux/extern.c
index 3c95296..01d4b33 100644
--- a/remux/extern.c
+++ b/remux/extern.c
@@ -118,7 +118,12 @@ void cTSExt::Action(void)
if (FD_ISSET(m_Outpipe, &rfds)) {
int result;
- if ((result = m_ResultBuffer->Read(m_Outpipe)) == -1) {
+ //Read returns 0 if buffer full or EOF
+ bool bufferFull = m_ResultBuffer->Free() <= 0; //Free may be < 0
+ while ((result = m_ResultBuffer->Read(m_Outpipe)) == 0 && bufferFull)
+ dsyslog("streamdev-server: buffer full while reading from externremux");
+
+ if (result == -1) {
if (errno != EINTR) {
LOG_ERROR_STR("read failed");
m_Active = false;
@@ -149,7 +154,7 @@ cExternRemux::cExternRemux(int VPid, const int *APids, const int *Dpids, const i
m_ResultBuffer(new cRingBufferLinear(WRITERBUFSIZE, TS_SIZE * 2)),
m_Remux(new cTSExt(m_ResultBuffer))
{
- m_ResultBuffer->SetTimeouts(0, 100);
+ m_ResultBuffer->SetTimeouts(500, 100);
}
cExternRemux::~cExternRemux()
diff --git a/server/connectionVTP.c b/server/connectionVTP.c
index c847bf3..5ca2df6 100644
--- a/server/connectionVTP.c
+++ b/server/connectionVTP.c
@@ -1,5 +1,5 @@
/*
- * $Id: connectionVTP.c,v 1.14 2007/05/09 09:12:42 schmirl Exp $
+ * $Id: connectionVTP.c,v 1.15 2007/09/21 12:45:31 schmirl Exp $
*/
#include "server/connectionVTP.h"
@@ -469,7 +469,7 @@ cConnectionVTP::cConnectionVTP(void):
m_FilterSocket(NULL),
m_FilterStreamer(NULL),
m_LastCommand(NULL),
- m_NoTSPIDS(false),
+ m_StreamType(stTSPIDS),
m_LSTEHandler(NULL),
m_LSTCHandler(NULL),
m_LSTTHandler(NULL)
@@ -572,13 +572,27 @@ bool cConnectionVTP::Command(char *Cmd)
bool cConnectionVTP::CmdCAPS(char *Opts)
{
if (strcasecmp(Opts, "TS") == 0) {
- m_NoTSPIDS = true;
- return Respond(220, "Ignored, capability \"%s\" accepted for "
- "compatibility", Opts);
+ m_StreamType = stTS;
+ return Respond(220, "Capability \"%s\" accepted", Opts);
}
if (strcasecmp(Opts, "TSPIDS") == 0) {
- m_NoTSPIDS = false;
+ m_StreamType = stTSPIDS;
+ return Respond(220, "Capability \"%s\" accepted", Opts);
+ }
+
+ if (strcasecmp(Opts, "PS") == 0) {
+ m_StreamType = stPS;
+ return Respond(220, "Capability \"%s\" accepted", Opts);
+ }
+
+ if (strcasecmp(Opts, "PES") == 0) {
+ m_StreamType = stPES;
+ return Respond(220, "Capability \"%s\" accepted", Opts);
+ }
+
+ if (strcasecmp(Opts, "EXTERN") == 0) {
+ m_StreamType = stExtern;
return Respond(220, "Capability \"%s\" accepted", Opts);
}
@@ -715,7 +729,7 @@ bool cConnectionVTP::CmdTUNE(char *Opts)
delete m_LiveStreamer;
m_LiveStreamer = new cStreamdevLiveStreamer(1);
- m_LiveStreamer->SetChannel(chan, m_NoTSPIDS ? stTS : stTSPIDS);
+ m_LiveStreamer->SetChannel(chan, m_StreamType);
m_LiveStreamer->SetDevice(dev);
if(m_LiveSocket)
m_LiveStreamer->Start(m_LiveSocket);
diff --git a/server/connectionVTP.h b/server/connectionVTP.h
index fffff4f..aa9a90f 100644
--- a/server/connectionVTP.h
+++ b/server/connectionVTP.h
@@ -23,7 +23,7 @@ private:
cStreamdevFilterStreamer *m_FilterStreamer;
char *m_LastCommand;
- bool m_NoTSPIDS;
+ eStreamType m_StreamType;
// Members adopted for SVDRP
cRecordings Recordings;
diff --git a/server/streamer.c b/server/streamer.c
index 63d2f60..979032a 100644
--- a/server/streamer.c
+++ b/server/streamer.c
@@ -1,5 +1,5 @@
/*
- * $Id: streamer.c,v 1.15 2007/04/02 10:32:34 schmirl Exp $
+ * $Id: streamer.c,v 1.16 2007/09/21 11:45:53 schmirl Exp $
*/
#include <vdr/ringbuffer.h>
@@ -141,6 +141,8 @@ void cStreamdevStreamer::Action(void)
int count = Put(block, got);
if (count)
m_RingBuffer->Del(count);
+ else
+ cCondWait::SleepMs(100);
}
}
}
diff --git a/tools/source.c b/tools/source.c
index c328d7c..8a6b5f5 100644
--- a/tools/source.c
+++ b/tools/source.c
@@ -140,8 +140,10 @@ ssize_t cTBSource::ReadUntil(void *Buffer, size_t Length, const char *Seq,
len = m_LineBuffer.size();
m_LineBuffer.resize(BUFSIZ);
- if ((b = Read((char*)m_LineBuffer.data() + len, BUFSIZ - len)) == -1)
+ if ((b = Read((char*)m_LineBuffer.data() + len, BUFSIZ - len)) == -1) {
+ m_LineBuffer.resize(len);
return -1;
+ }
m_LineBuffer.resize(len + b);
if ((len = m_LineBuffer.find(Seq)) != (size_t)-1) {