summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Grimm <tobias@e-tobi.loc>2008-12-13 10:51:16 +0100
committerTobias Grimm <tobias@e-tobi.loc>2008-12-13 10:51:16 +0100
commitb4047ea57428a788456ecb02bc3fc6c5d83bf232 (patch)
treef346c1181b786177c9e67469ad0cf759dfd42ddf
parente98281852544a159522de0e561ac64c23c447468 (diff)
downloadvdr-plugin-ttxtsubs-0.0.3c.tar.gz
vdr-plugin-ttxtsubs-0.0.3c.tar.bz2
- Fixed problems when used with more than one device (I hope)v0.0.3c
-rw-r--r--HISTORY3
-rw-r--r--siinfo.c30
-rw-r--r--siinfo.h4
-rw-r--r--ttxtsubs.c56
-rw-r--r--ttxtsubsdisplay.c10
-rw-r--r--ttxtsubsdisplay.h2
-rw-r--r--ttxtsubsdisplayer.c2
-rw-r--r--ttxtsubsfilter.c5
-rw-r--r--ttxtsubsfilter.h2
-rw-r--r--ttxtsubsrecorder.c2
10 files changed, 73 insertions, 43 deletions
diff --git a/HISTORY b/HISTORY
index d9e817f..10046e7 100644
--- a/HISTORY
+++ b/HISTORY
@@ -1,6 +1,9 @@
VDR Plugin 'ttxtsubs' Revision History
--------------------------------------
+2003-07-10: Version 0.0.3c
+- Fixed problems when used with more than one device (I hope)
+
2003-06-22: Version 0.0.3b
- Work around for problem with stray segments at channel (frequency)
change with driver in hw_sections=0 mode
diff --git a/siinfo.c b/siinfo.c
index 896f5b0..a478a9b 100644
--- a/siinfo.c
+++ b/siinfo.c
@@ -429,6 +429,7 @@ static int FindTtxtInfoInPMT(int card_no, int pid, int vpid, struct ttxtinfo *in
return ret;
}
+#if 0
/*
* Get dvb device number from device index
* this is needed for those having cards which aren't dvb cards, like
@@ -448,14 +449,14 @@ int DeviceToCardNo(int device_no)
return card_no;
}
-
+#endif
/*
* find the ttxt_info in the PMT via the PAT, try first with the SID
* and if that fails with the VPID
* return <> 0 on error;
*/
-int GetTtxtInfo(int device_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *info)
+int GetTtxtInfo(int card_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *info)
{
int ret;
char *patsects[256];
@@ -464,7 +465,6 @@ int GetTtxtInfo(int device_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *inf
int j;
uint16_t pmt_pid = 0;
int foundinfo = 0;
- int card_no;
int retry;
memset((char *) info, 0, sizeof(*info));
@@ -473,12 +473,10 @@ int GetTtxtInfo(int device_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *inf
// printf("GetTtxtInfo A sid: %d, vpid: %d\n", sid, vpid); // XXXX
- card_no = DeviceToCardNo(device_no);
- if(card_no == -1) {
- fprintf(stderr, "ttxtsubs: GetTtxtInfo - couldn't find a card for device %d\n", card_no);
- }
-
+#if 1
+ // firmware fixed now?
DiscardBufferedSections(card_no, 0, 0);
+#endif
ret = CollectSections(card_no, 0, 0, patsects, &numsects);
if(ret)
@@ -559,6 +557,22 @@ void FreeTtxtInfoData(struct ttxtinfo *info)
}
+void DupTtxtInfo(struct ttxtinfo *in, struct ttxtinfo *out)
+{
+ int i;
+
+ out->pidcount = in->pidcount;
+ out->p = (struct ttxtpidinfo *) malloc(sizeof(out->p[0]) * in->pidcount);
+
+ for(i = 0; i < in->pidcount; i++) {
+ out->p[i].pid = in->p[i].pid;
+ out->p[i].pagecount = in->p[i].pagecount;
+ out->p[i].i = (struct ttxtpageinfo *) malloc(sizeof(out->p[0].i[0]) * in->p[i].pagecount);
+ memcpy((void *) out->p[i].i, (void *) in->p[i].i, sizeof(out->p[0].i[0]) * in->p[i].pagecount);
+ }
+}
+
+
struct ttxtpidinfo *FindSubs(struct ttxtinfo *info, char *lang, int HI, int *pid, int *pageno)
{
struct ttxtpidinfo *foundNonHIInfo = NULL;
diff --git a/siinfo.h b/siinfo.h
index 96211c7..37c8a15 100644
--- a/siinfo.h
+++ b/siinfo.h
@@ -19,6 +19,7 @@ struct ttxtpidinfo {
struct ttxtpageinfo *i;
};
+// XXX should be an object instead and use c++ vectors etc
struct ttxtinfo {
int pidcount;
struct ttxtpidinfo *p;
@@ -29,8 +30,9 @@ struct ttxtinfo {
* and if that fails with the VPID
* return <> 0 on error;
*/
-int GetTtxtInfo(int device_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *info);
+int GetTtxtInfo(int card_no, uint16_t sid, uint16_t vpid, struct ttxtinfo *info);
void FreeTtxtInfoData(struct ttxtinfo *info);
+void DupTtxtInfo(struct ttxtinfo *in, struct ttxtinfo *out);
struct ttxtpidinfo *FindSubs(struct ttxtinfo *info, char *lang, int HI, int *pid, int *pageno);
diff --git a/ttxtsubs.c b/ttxtsubs.c
index 50e23b2..78643ab 100644
--- a/ttxtsubs.c
+++ b/ttxtsubs.c
@@ -3,7 +3,7 @@
*
* See the README file for copyright information and how to reach the author.
*
- * $Id: ttxtsubs.c,v 1.16 2003/06/22 23:24:41 ragge Exp $
+ * $Id: ttxtsubs.c,v 1.17 2003/07/10 02:36:17 ragge Exp ragge $
*/
#include <vdr/plugin.h>
@@ -18,7 +18,7 @@
#include "siinfo.h"
#include "ttxtsubs.h"
-static const char *VERSION = "0.0.3b";
+static const char *VERSION = "0.0.3c";
static const char *DESCRIPTION = "Teletext subtitles";
//static const char *MAINMENUENTRY = "Ttxtsubs";
@@ -211,31 +211,35 @@ bool cPluginTtxtsubs::SetupParse(const char *Name, const char *Value)
void cPluginTtxtsubs::ChannelSwitch(const cDevice *Device, int ChannelNumber)
{
- if(ChannelNumber) {
- cChannel *c = Channels.GetByNumber(ChannelNumber);
- if(c) {
- struct ttxtinfo info;
- int pid, page;
-
- if(GetTtxtInfo(Device->DeviceNumber(), c->Sid(), c->Vpid(), &info)) {
- fprintf(stderr, "ttxtsubs: Error: GetTtxtInfo failed!\n");
- } else {
- if(FindSubs(&info, mLanguage, mHearingImpaired, &pid, &page)) {
- //fprintf(stderr, "CHANNELSWITCH, pid: %d page: %x\n", pid, page);
- mPage = page; // XXX remember this for playback (temporary hack)!
- StartTtxtLive(Device, pid, page);
+ if(Device->IsPrimaryDevice()) {
+ if(ChannelNumber) {
+ cChannel *c = Channels.GetByNumber(ChannelNumber);
+ if(c) {
+ struct ttxtinfo info;
+ int pid, page;
+
+ if(GetTtxtInfo(Device->ActualDevice()->CardIndex(), c->Sid(), c->Vpid(), &info)) {
+ fprintf(stderr, "ttxtsubs: Error: GetTtxtInfo failed!\n");
+ } else {
+ if(FindSubs(&info, mLanguage, mHearingImpaired, &pid, &page)) {
+ //fprintf(stderr, "CHANNELSWITCH, pid: %d page: %x\n", pid, page);
+ mPage = page; // XXX remember this for playback (temporary hack)!
+ StartTtxtLive(Device, pid, page);
+ }
+ FreeTtxtInfoData(&info);
}
- FreeTtxtInfoData(&info);
}
- }
- } else
- StopTtxt();
+ } else
+ StopTtxt();
+ }
}
void cPluginTtxtsubs::Replaying(const cControl *Control, const char *Name)
{
StopTtxt();
- StartTtxtPlay(mPage); // XXX should get page in some other way!
+ StartTtxtPlay(mPage);
+ // XXX this page number is just a fallback for old recordings which
+ // don't have a index page
}
void cPluginTtxtsubs::PlayerTeletextData(uint8_t *p, int length)
@@ -265,6 +269,12 @@ void cPluginTtxtsubs::StartTtxtLive(const cDevice *Device, int pid, int page)
{
//dprint("cPluginTtxtsubs::StartTtxtLive\n");
+ fprintf(stderr, "cPluginTtxtsubs::StartTtxtLive(%d, %d, %03x)\n",
+ Device->DeviceNumber(), pid, page);
+ fprintf(stderr,
+ "cPluginTtxtsubs::StartTtxtLive CurrChan: %d Prim:%d Card:%d MPG:%d HasProg:%d\n",
+ cDevice::CurrentChannel(), Device->IsPrimaryDevice(), Device->CardIndex(),
+ Device->HasDecoder(), const_cast < cDevice * >( Device )->HasProgramme());
#if 0
return; // XXX TEST - No live subs
#endif
@@ -273,7 +283,7 @@ void cPluginTtxtsubs::StartTtxtLive(const cDevice *Device, int pid, int page)
cTtxtSubsLiveReceiver *r;
//dprint("teletext subtitles started on pid %d\n", pid);
mRec = r = new cTtxtSubsLiveReceiver(pid, page);
- if(!cDevice::PrimaryDevice()->AttachReceiver(r))
+ if(!cDevice::PrimaryDevice()->ActualDevice()->AttachReceiver(r))
fprintf(stderr, "ttxtsubs: Error: AttachReceiver failed!\n"); //
} else
fprintf(stderr, "ttxtsubs: Error: StartTtxtLive called when already started!\n");
@@ -281,7 +291,7 @@ void cPluginTtxtsubs::StartTtxtLive(const cDevice *Device, int pid, int page)
void cPluginTtxtsubs::StartTtxtPlay(int backup_page)
{
- //dprint("cPluginTtxtsubs::StartTtxtPlay\n");
+ dprint("cPluginTtxtsubs::StartTtxtPlay\n");
if(!mRec) {
dprint("ttxtsubs: teletext subtitles replayer started with initial page %03x\n", backup_page);
@@ -292,7 +302,7 @@ void cPluginTtxtsubs::StartTtxtPlay(int backup_page)
void cPluginTtxtsubs::StopTtxt(void)
{
- //dprint("cPluginTtxtsubs::StopTtxt\n");
+ dprint("cPluginTtxtsubs::StopTtxt\n");
if(mRec) {
HideTtxt();
diff --git a/ttxtsubsdisplay.c b/ttxtsubsdisplay.c
index d44729e..817bdb4 100644
--- a/ttxtsubsdisplay.c
+++ b/ttxtsubsdisplay.c
@@ -44,7 +44,7 @@ cTtxtSubsDisplay::~cTtxtSubsDisplay(void)
}
-void cTtxtSubsDisplay::SetPage(int Pageno)
+void cTtxtSubsDisplay::SetPage(int Pageno) // Pageno is 0x000 to 0x799
{
Clear();
@@ -140,14 +140,16 @@ void cTtxtSubsDisplay::TtxtData(const uint8_t *Data)
page.flags = 0;
page.national_charset = 0;
- if(fi[3] & 0x80) { // Newsflash
+ if(fi[3] & 0x80) { // Erase Page
page.flags |= erasepage;
memset(&page.data, 0, sizeof(page.data)); // only if erasepage is set?
}
- if(fi[5] & 0x20) // Subtitle
+ if(fi[5] & 0x20) // Newsflash
page.flags |= newsflash;
- if(fi[5] & 0x80) // Suppress Header
+ if(fi[5] & 0x80) // Subtitle
page.flags |= subtitle;
+ if(fi[6] & 0x02) // Suppress Header
+ page.flags |= suppress_header;
// if(fi[6] & 0x08) // Update Indicator
// if(fi[6] & 0x20) // Interrupted Sequence
if(fi[6] & 0x80) // Inhibit Display
diff --git a/ttxtsubsdisplay.h b/ttxtsubsdisplay.h
index 42905ff..d515cd0 100644
--- a/ttxtsubsdisplay.h
+++ b/ttxtsubsdisplay.h
@@ -13,7 +13,7 @@ class cTtxtSubsDisplay {
cTtxtSubsDisplay(void);
~cTtxtSubsDisplay(void);
- void SetPage(int Pageno);
+ void SetPage(int Pageno); // Pageno is 0x000 to 0x799
void Hide(void);
void Show(void);
void Clear(void);
diff --git a/ttxtsubsdisplayer.c b/ttxtsubsdisplayer.c
index de9348c..5f2f0a6 100644
--- a/ttxtsubsdisplayer.c
+++ b/ttxtsubsdisplayer.c
@@ -224,7 +224,7 @@ void cTtxtSubsPlayer::SearchLanguagePage(uint8_t *p, int len)
((buf[i+4] - '0') << 8) +
((buf[i+5] - '0') << 4) +
(buf[i+6] - '0');
- if(page >= 0x100 && page <= 0x900) {
+ if(page >= 0x100 && page < 0x900) {
if(page >= 0x800)
page -= 0x800;
diff --git a/ttxtsubsfilter.c b/ttxtsubsfilter.c
index b997e82..9271215 100644
--- a/ttxtsubsfilter.c
+++ b/ttxtsubsfilter.c
@@ -24,7 +24,7 @@ cTtxtSubsFilter::~cTtxtSubsFilter(void)
}
-void cTtxtSubsFilter::SetPages(int count, uint16_t *pages)
+void cTtxtSubsFilter::SetPages(size_t count, uint16_t *pages)
{
FreePages();
@@ -35,9 +35,8 @@ void cTtxtSubsFilter::SetPages(int count, uint16_t *pages)
mCount = count;
if(0) {
- int i;
fprintf(stderr, "SetPages: %d, ", count);
- for(i = 0; i < count; i++)
+ for(size_t i = 0; i < count; i++)
fprintf(stderr, "%03x ", pages[i]);
fprintf(stderr, "\n");
}
diff --git a/ttxtsubsfilter.h b/ttxtsubsfilter.h
index 3e09b20..ed1d0e8 100644
--- a/ttxtsubsfilter.h
+++ b/ttxtsubsfilter.h
@@ -8,7 +8,7 @@ class cTtxtSubsFilter
cTtxtSubsFilter(void);
virtual ~cTtxtSubsFilter(void);
- void SetPages(int count, uint16_t *pages);
+ void SetPages(size_t count, uint16_t *pages);
// indata and outdata are pointers to a ttxt data row buffers,
// if return value <> 0 outdata countains data to pass on
diff --git a/ttxtsubsrecorder.c b/ttxtsubsrecorder.c
index b6719af..19c7b6f 100644
--- a/ttxtsubsrecorder.c
+++ b/ttxtsubsrecorder.c
@@ -32,7 +32,7 @@ cTtxtSubsRecorder::cTtxtSubsRecorder(cDevice *dev, const cChannel *ch, char *lan
struct ttxtpidinfo *pi = NULL;
int pid, page;
- if(GetTtxtInfo(dev->DeviceNumber(), ch->Sid(), ch->Vpid(), mTtxtinfo)) {
+ if(GetTtxtInfo(dev->CardIndex(), ch->Sid(), ch->Vpid(), mTtxtinfo)) {
fprintf(stderr, "cTtxtSubsRecorder::cTtxtSubsRecorder: GetTtxtSubtitleInfo error!\n");
} else {
pi = FindSubs(mTtxtinfo, lang, HI, &pid, &page);