libtriple: Tripledragon can only do one TS at a time :-(

This commit is contained in:
Stefan Seyfried
2011-10-02 20:36:15 +02:00
parent f3fdf7c91b
commit 65e0316c79
2 changed files with 33 additions and 5 deletions

View File

@@ -20,7 +20,7 @@ cDemux *audioDemux = NULL;
//cDemux *pcrDemux = NULL; //cDemux *pcrDemux = NULL;
static const char *DMX_T[] = { static const char *DMX_T[] = {
"", "DMX_INVALID",
"DMX_VIDEO_CHANNEL", "DMX_VIDEO_CHANNEL",
"DMX_AUDIO_CHANNEL", "DMX_AUDIO_CHANNEL",
"DMX_PES_CHANNEL", "DMX_PES_CHANNEL",
@@ -37,6 +37,10 @@ static const char *devname[] = {
"/dev/" DEVICE_NAME_DEMUX "2", "/dev/" DEVICE_NAME_DEMUX "2",
}; };
/* uuuugly */
static int dmx_tp_count = 0;
#define MAX_TS_COUNT 1
cDemux::cDemux(int n) cDemux::cDemux(int n)
{ {
if (n < 0 || n > 2) if (n < 0 || n > 2)
@@ -57,16 +61,30 @@ cDemux::~cDemux()
bool cDemux::Open(DMX_CHANNEL_TYPE pes_type, void * /*hVideoBuffer*/, int uBufferSize) bool cDemux::Open(DMX_CHANNEL_TYPE pes_type, void * /*hVideoBuffer*/, int uBufferSize)
{ {
int devnum = num;
if (fd > -1) if (fd > -1)
lt_info("%s FD ALREADY OPENED? fd = %d\n", __FUNCTION__, fd); lt_info("%s FD ALREADY OPENED? fd = %d\n", __FUNCTION__, fd);
fd = open(devname[num], O_RDWR); if (pes_type == DMX_TP_CHANNEL)
{
/* it looks like the drivers can only do one TS at a time */
if (dmx_tp_count >= MAX_TS_COUNT)
{
lt_info("%s too many DMX_TP_CHANNEL requests :-(\n", __FUNCTION__);
dmx_type = DMX_INVALID;
fd = -1;
return false;
}
dmx_tp_count++;
devnum = dmx_tp_count;
}
fd = open(devname[devnum], O_RDWR);
if (fd < 0) if (fd < 0)
{ {
lt_info("%s %s: %m\n", __FUNCTION__, devname[num]); lt_info("%s %s: %m\n", __FUNCTION__, devname[devnum]);
return false; return false;
} }
lt_debug("%s #%d pes_type: %s (%d), uBufferSize: %d devname: %s fd: %d\n", __FUNCTION__, lt_debug("%s #%d pes_type: %s (%d), uBufferSize: %d devname: %s fd: %d\n", __FUNCTION__,
num, DMX_T[pes_type], pes_type, uBufferSize, devname[num], fd); num, DMX_T[pes_type], pes_type, uBufferSize, devname[devnum], fd);
dmx_type = pes_type; dmx_type = pes_type;
@@ -117,6 +135,15 @@ void cDemux::Close(void)
ioctl(fd, DEMUX_STOP); ioctl(fd, DEMUX_STOP);
close(fd); close(fd);
fd = -1; fd = -1;
if (dmx_type == DMX_TP_CHANNEL)
{
dmx_tp_count--;
if (dmx_tp_count < 0)
{
lt_info("%s dmx_tp_count < 0!!\n", __func__);
dmx_tp_count = 0;
}
}
} }
bool cDemux::Start(bool) bool cDemux::Start(bool)
@@ -404,7 +431,7 @@ bool cDemux::addPid(unsigned short Pid)
lt_info("%s #%d Pid = %hx open failed (%m)\n", __FUNCTION__, num, Pid); lt_info("%s #%d Pid = %hx open failed (%m)\n", __FUNCTION__, num, Pid);
return false; return false;
} }
lt_debug("%s #%d Pid = %hx pfd = %d\n", __FUNCTION__, num, Pid, pfd); lt_debug("%s #%d Pid = %hx pfd = %d\n", __FUNCTION__, num, Pid, pfd.fd);
p.pid = Pid; p.pid = Pid;
p.pesType = DMX_PES_OTHER; p.pesType = DMX_PES_OTHER;

View File

@@ -14,6 +14,7 @@ extern "C" {
typedef enum typedef enum
{ {
DMX_INVALID = 0,
DMX_VIDEO_CHANNEL = 1, DMX_VIDEO_CHANNEL = 1,
DMX_AUDIO_CHANNEL, DMX_AUDIO_CHANNEL,
DMX_PES_CHANNEL, DMX_PES_CHANNEL,