Skip to content

Commit

Permalink
Fixes a few RTP bugs preventing data from getting to the MPEGStreamDa…
Browse files Browse the repository at this point in the history
…ta::ProcessData() function.
  • Loading branch information
daniel-kristjansson committed Feb 16, 2012
1 parent e124592 commit 1e7606d
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 14 deletions.
7 changes: 4 additions & 3 deletions mythtv/libs/libmythtv/iptvchannel.cpp
Expand Up @@ -16,7 +16,8 @@
#define LOC QString("IPTVChan(%1): ").arg(GetCardID())

IPTVChannel::IPTVChannel(TVRec *rec, const QString&) :
DTVChannel(rec), m_open(false), m_stream_data(NULL)
DTVChannel(rec), m_open(false),
m_stream_handler(NULL), m_stream_data(NULL)
{
LOG(VB_CHANNEL, LOG_INFO, LOC + "ctor");
}
Expand Down Expand Up @@ -53,7 +54,7 @@ void IPTVChannel::SetStreamData(MPEGStreamData *sd)
{
QMutexLocker locker(&m_lock);
if (m_stream_data && m_stream_handler)
m_stream_handler->RemoveListener(sd);
m_stream_handler->RemoveListener(m_stream_data);
m_stream_data = sd;
if (m_stream_data && m_stream_handler)
m_stream_handler->AddListener(m_stream_data);
Expand Down Expand Up @@ -105,7 +106,7 @@ bool IPTVChannel::Tune(const QString &freqid, int finetune)

m_last_channel_id = channel_id;

return false;
return true;
}

/* vim: set expandtab tabstop=4 shiftwidth=4: */
7 changes: 7 additions & 0 deletions mythtv/libs/libmythtv/iptvsignalmonitor.cpp
Expand Up @@ -63,6 +63,13 @@ void IPTVSignalMonitor::Stop(void)
LOG(VB_CHANNEL, LOG_INFO, LOC + "Stop() -- end");
}

void IPTVSignalMonitor::HandlePAT(const ProgramAssociationTable *pat)
{
LOG(VB_CHANNEL, LOG_INFO, LOC + QString("HandlePAT pn: %1")
.arg(programNumber));
DTVSignalMonitor::HandlePAT(pat);
}

/** \fn IPTVSignalMonitor::UpdateValues(void)
* \brief Fills in frontend stats and emits status Qt signals.
*
Expand Down
3 changes: 3 additions & 0 deletions mythtv/libs/libmythtv/iptvsignalmonitor.h
Expand Up @@ -18,6 +18,9 @@ class IPTVSignalMonitor : public DTVSignalMonitor

void Stop(void);

// MPEG
void HandlePAT(const ProgramAssociationTable*);

protected:
IPTVSignalMonitor(void);
IPTVSignalMonitor(const IPTVSignalMonitor&);
Expand Down
23 changes: 20 additions & 3 deletions mythtv/libs/libmythtv/iptvstreamhandler.cpp
Expand Up @@ -28,7 +28,7 @@ IPTVStreamHandler *IPTVStreamHandler::Get(const QString &devname)
if (it == s_handlers.end())
{
IPTVStreamHandler *newhandler = new IPTVStreamHandler(devkey);
newhandler->Open();
newhandler->Start();
s_handlers[devkey] = newhandler;
s_handlers_refcnt[devkey] = 1;

Expand Down Expand Up @@ -71,7 +71,7 @@ void IPTVStreamHandler::Return(IPTVStreamHandler * & ref)
{
LOG(VB_RECORD, LOG_INFO, QString("IPTVSH: Closing handler for %1")
.arg(devname));
ref->Close();
ref->Stop();
delete *it;
s_handlers.erase(it);
}
Expand All @@ -89,6 +89,7 @@ void IPTVStreamHandler::Return(IPTVStreamHandler * & ref)
IPTVStreamHandler::IPTVStreamHandler(const QString &device) :
StreamHandler(device)
{
memset(m_sockets, 0, sizeof(m_sockets));
QStringList parts = device.split("!");
if (parts.size() >= 5)
{
Expand All @@ -107,10 +108,21 @@ IPTVStreamHandler::IPTVStreamHandler(const QString &device) :
}
}

void IPTVStreamHandler::SetRunningDesired(bool desired)
{
StreamHandler::SetRunningDesired(desired);
if (!desired)
exit(0);
}

void IPTVStreamHandler::run(void)
{
RunProlog();

LOG(VB_GENERAL, LOG_INFO, LOC + "run()");

SetRunning(true, false, false);

// TODO Error handling..

// Setup
Expand All @@ -125,6 +137,7 @@ void IPTVStreamHandler::run(void)
}
m_buffer = new RTPPacketBuffer(m_bitrate);
m_write_helper = new IPTVStreamHandlerWriteHelper(this);
m_write_helper->Start();

// Enter event loop
exec();
Expand All @@ -145,6 +158,7 @@ void IPTVStreamHandler::run(void)
delete m_write_helper;
m_write_helper = NULL;

SetRunning(false, false, false);
RunEpilog();
}

Expand Down Expand Up @@ -209,7 +223,10 @@ void IPTVStreamHandlerWriteHelper::timerEvent(QTimerEvent*)
IPTVStreamHandler::StreamDataList::const_iterator sit;
sit = m_parent->_stream_data_list.begin();
for (; sit != m_parent->_stream_data_list.end(); ++sit)
remainder = sit.key()->ProcessData(ts_packet.GetTSData(), ts_packet.GetTSDataSize());
{
remainder = sit.key()->ProcessData(
ts_packet.GetTSData(), ts_packet.GetTSDataSize());
}

m_parent->_listener_lock.unlock();

Expand Down
9 changes: 6 additions & 3 deletions mythtv/libs/libmythtv/iptvstreamhandler.h
Expand Up @@ -24,6 +24,8 @@ class IPTVChannel;

class IPTVStreamHandlerReadHelper : QObject
{
Q_OBJECT

public:
IPTVStreamHandlerReadHelper(IPTVStreamHandler *p, QUdpSocket *s, uint stream) :
m_parent(p), m_socket(s), m_stream(stream)
Expand All @@ -43,6 +45,8 @@ class IPTVStreamHandlerReadHelper : QObject

class IPTVStreamHandlerWriteHelper : QObject
{
Q_OBJECT

public:
IPTVStreamHandlerWriteHelper(IPTVStreamHandler *p) : m_parent(p) { }
~IPTVStreamHandlerWriteHelper()
Expand Down Expand Up @@ -86,11 +90,10 @@ class IPTVStreamHandler : public StreamHandler
private:
IPTVStreamHandler(const QString &);

bool Open(void) { return true; }
void Close(void) { MThread::exit(0); }

virtual void run(void); // MThread

virtual void SetRunningDesired(bool desired); // StreamHandler

private:
// TODO should we care about who is broadcasting to us?
QHostAddress m_addr;
Expand Down
25 changes: 20 additions & 5 deletions mythtv/libs/libmythtv/rtp/rtpdatapacket.h
Expand Up @@ -9,6 +9,7 @@
#include <arpa/inet.h> // for ntohs()/ntohl()

#include "udppacket.h"
#include "mythlogging.h"

/** \brief RTP Data Packet
*
Expand All @@ -33,32 +34,46 @@ class RTPDataPacket : public UDPPacket
bool IsValid(void) const
{
if (m_data.size() < 12)
{
return false;

}
if (2 != GetVersion())
{
LOG(VB_GENERAL, LOG_INFO, QString("Version incorrect %1")
.arg(GetVersion()));
return false;

}
if (HasPadding() && (m_data.size() < 1328))
{
LOG(VB_GENERAL, LOG_INFO, QString("HasPadding && %1 < 1328")
.arg(m_data.size()));
return false;
}

int off = 12 + 4 * GetCSRCCount();
if (off > m_data.size())
{
LOG(VB_GENERAL, LOG_INFO, QString("off %1 > sz %2")
.arg(off).arg(m_data.size()));
return false;

}
if (HasExtension())
{
uint ext_size = m_data[off+2] << 8 | m_data[off+3];
off += 4 * (1 + ext_size);
}
if (off > m_data.size())
{
LOG(VB_GENERAL, LOG_INFO, QString("off + ext %1 > sz %2")
.arg(off).arg(m_data.size()));
return false;

}
m_off = off;

return true;
}

uint GetVersion(void) const { return (m_data[0] >> 6); }
uint GetVersion(void) const { return (m_data[0] >> 6) & 0x3; }
bool HasPadding(void) const { return (m_data[0] >> 5) & 0x1; }
bool HasExtension(void) const { return (m_data[0] >> 4) & 0x1; }
uint GetCSRCCount(void) const { return m_data[0] & 0xf; }
Expand Down

0 comments on commit 1e7606d

Please sign in to comment.